www.studiojvd.com Open in urlscan Pro
205.151.67.100  Malicious Activity! Public Scan

URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Submission Tags: 6694341
Submission: On July 24 via api from NL

Summary

This website contacted 3 IPs in 2 countries across 2 domains to perform 8 HTTP transactions. The main IP is 205.151.67.100, located in Salaberry-de-Valleyfield, Canada and belongs to CC-3272, CA. The main domain is www.studiojvd.com.
TLS certificate: Issued by Let's Encrypt Authority X3 on June 19th 2020. Valid for: 3 months.
This is the only time www.studiojvd.com was scanned on urlscan.io!

urlscan.io Verdict: Potentially Malicious

Targeting these brands: Amazon (Online)

Domain & IP information

IP Address AS Autonomous System
7 205.151.67.100 11290 (CC-3272)
1 2a04:4e42:1b:... 54113 (FASTLY)
8 3
Apex Domain
Subdomains
Transfer
7 studiojvd.com
www.studiojvd.com
360 KB
1 media-amazon.com
m.media-amazon.com
28 KB
8 2
Domain Requested by
7 www.studiojvd.com www.studiojvd.com
1 m.media-amazon.com www.studiojvd.com
8 2

This site contains no links.

Subject Issuer Validity Valid
www.studiojvd.com
Let's Encrypt Authority X3
2020-06-19 -
2020-09-17
3 months crt.sh
images-na.ssl-images-amazon.com
DigiCert Global CA G2
2019-10-02 -
2020-10-02
a year crt.sh

This page contains 1 frames:

Primary Page: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Frame ID: 812CE5C0F44F7995F23CDE4D64163833
Requests: 11 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /Ubuntu/i

Overall confidence: 100%
Detected patterns
  • headers server /nginx(?:\/([\d.]+))?/i

Page Statistics

8
Requests

100 %
HTTPS

50 %
IPv6

2
Domains

2
Subdomains

3
IPs

2
Countries

388 kB
Transfer

1368 kB
Size

0
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

8 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request verifying.htm
www.studiojvd.com/wp-content/themes/skanda/new/
1 MB
360 KB
Document
General
Full URL
https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
205.151.67.100 Salaberry-de-Valleyfield, Canada, ASN11290 (CC-3272, CA),
Reverse DNS
205-151-67-100.static.cgocable.ca
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
b3c0f99396542edc39d6a4bc4d5959c6a6590826ed95cc32d71d2b7de9167242

Request headers

Host
www.studiojvd.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
none
Sec-Fetch-Mode
navigate
Sec-Fetch-User
?1
Sec-Fetch-Dest
document
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Server
nginx/1.14.0 (Ubuntu)
Date
Fri, 24 Jul 2020 22:12:07 GMT
Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Last-Modified
Thu, 09 Jul 2020 04:16:56 GMT
ETag
"12aee2-5a9fa7eb0fe00-gzip"
Accept-Ranges
bytes
Vary
Accept-Encoding
Content-Encoding
gzip
truncated
/
142 KB
0
Stylesheet
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
03c72738db8285d60d47af44d6577c9f9d42ead13e3aadebe56607c6308ee8a8

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
text/css
truncated
/
2 KB
0
Stylesheet
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ac6c8a640f5b8fea68c8aeaaad4e145c8261be36ba09df844e4121fb69e90cc7

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
text/css
truncated
/
214 B
0
Stylesheet
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5ecf14a99f6350aee90b13d26693375b763a74ff1c9fdec14613858c075a976c

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Content-Type
text/css
ZCgiQW1hem9uVUkiLCJBbWF6b25VSSIpOmE7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChjKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7YyhiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYSxkKXthLnBjdj1hLnBjdnx8e307YS5wY3YuQW1hem9uV...
www.studiojvd.com/wp-content/themes/skanda/new/LyoKIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi40CiBodHRwOi8vanF1ZXJ5LmNvbS8KCiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTU...
0
0
Script
General
Full URL
https://www.studiojvd.com/wp-content/themes/skanda/new/LyoKIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi40CiBodHRwOi8vanF1ZXJ5LmNvbS8KCiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCgogSW5jbHVkZXMgU2l6emxlLmpzCiBodHRwOi8vc2l6emxlanMuY29tLwogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KCiBBbWF6b24gZWxlY3RzIHRvIHVzZSBqUXVlcnkgYW5kIFNpenpsZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCgogRGF0ZTogTW9uIFNlcCAxMiAxODo1NDo0OCAyMDExIC0wNDAwCiovCihmdW5jdGlvbihLKXt2YXIgcT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLEw9cS5fbmFtZXNwYWNlfHxxLmF0dHJpYnV0ZUVycm9ycyxEPUw/TCgiQW1hem9uVUlqUXVlcnkiLCJBbWF6b25VSSIpOnE7RC5ndWFyZEZhdGFsP0QuZ3VhcmRGYXRhbChLKShELHdpbmRvdyk6RC5leGVjdXRlKGZ1bmN0aW9uKCl7SyhELHdpbmRvdyl9KX0pKGZ1bmN0aW9uKEsscSxMKXtxLm5hdmlnYXRvciYmcS5uYXZpZ2F0b3IudXNlckFnZW50JiZLLmRlY2xhcmUoImpRdWVyeSIsZnVuY3Rpb24oKXtmdW5jdGlvbiBEKGEsYixkKXtpZih2b2lkIDA9PT1kJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKGliLCItJDEiKS50b0xvd2VyQ2FzZSgpLGQ9YS5nZXRBdHRyaWJ1dGUoZCksInN0cmluZyI9PT10eXBlb2YgZCl7dHJ5e2Q9InRydWUiPT09ZD8hMDoiZmFsc2UiPT09ZD8hMToibnVsbCI9PT1kP251bGw6Yy5pc05hTihkKT9qYi50ZXN0KGQpP2MucGFyc2VKU09OKGQpOgpkOnBhcnNlRmxvYXQoZCl9Y2F0Y2goZSl7fWMuZGF0YShhLGIsZCl9ZWxzZSBkPXZvaWQgMDtyZXR1cm4gZH1mdW5jdGlvbiBMKGEpe2Zvcih2YXIgYiBpbiBhKWlmKCJ0b0pTT04iIT09YilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB3YShhLGIsZCl7dmFyIGU9YisiZGVmZXIiLGY9YisicXVldWUiLGc9YisibWFyayIsaD1jLmRhdGEoYSxlLHZvaWQgMCwhMCk7IWh8fCJxdWV1ZSIhPT1kJiZjLmRhdGEoYSxmLHZvaWQgMCwhMCl8fCJtYXJrIiE9PWQmJmMuZGF0YShhLGcsdm9pZCAwLCEwKXx8c2V0VGltZW91dChmdW5jdGlvbigpe2MuZGF0YShhLGYsdm9pZCAwLCEwKXx8Yy5kYXRhKGEsZyx2b2lkIDAsITApfHwoYy5yZW1vdmVEYXRhKGEsZSwhMCksaC5yZXNvbHZlKCkpfSwwKX1mdW5jdGlvbiBFKCl7cmV0dXJuITF9ZnVuY3Rpb24gWCgpe3JldHVybiEwfWZ1bmN0aW9uIHhhKGEsYixkKXt2YXIgZT1jLmV4dGVuZCh7fSxkWzBdKTtlLnR5cGU9YTtlLm9yaWdpbmFsRXZlbnQ9Cnt9O2UubGl2ZUZpcmVkPXZvaWQgMDtjLmV2ZW50LmhhbmRsZS5jYWxsKGIsZSk7ZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmZFswXS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGtiKGEpe3ZhciBiLGQsZSxmLGcsaCxrLGwsbixwLG0seD1bXTtmPVtdO2c9Yy5fZGF0YSh0aGlzLCJldmVudHMiKTtpZihhLmxpdmVGaXJlZCE9PXRoaXMmJmcmJmcubGl2ZSYmIWEudGFyZ2V0LmRpc2FibGVkJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSl7YS5uYW1lc3BhY2UmJihtPW5ldyBSZWdFeHAoIihefFxcLikiK2EubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIikpO2EubGl2ZUZpcmVkPXRoaXM7dmFyIHE9Zy5saXZlLnNsaWNlKDApO2ZvcihrPTA7azxxLmxlbmd0aDtrKyspZz1xW2tdLGcub3JpZ1R5cGUucmVwbGFjZShpYSwiIik9PT1hLnR5cGU/Zi5wdXNoKGcuc2VsZWN0b3IpOnEuc3BsaWNlKGstLSwxKTtmPWMoYS50YXJnZXQpLmNsb3Nlc3QoZiwKYS5jdXJyZW50VGFyZ2V0KTtsPTA7Zm9yKG49Zi5sZW5ndGg7bDxuO2wrKylmb3IocD1mW2xdLGs9MDtrPHEubGVuZ3RoO2srKylpZihnPXFba10scC5zZWxlY3Rvcj09PWcuc2VsZWN0b3ImJighbXx8bS50ZXN0KGcubmFtZXNwYWNlKSkmJiFwLmVsZW0uZGlzYWJsZWQpe2g9cC5lbGVtO2U9bnVsbDtpZigibW91c2VlbnRlciI9PT1nLnByZVR5cGV8fCJtb3VzZWxlYXZlIj09PWcucHJlVHlwZSlhLnR5cGU9Zy5wcmVUeXBlLChlPWMoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGcuc2VsZWN0b3IpWzBdKSYmYy5jb250YWlucyhoLGUpJiYoZT1oKTtlJiZlPT09aHx8eC5wdXNoKHtlbGVtOmgsaGFuZGxlT2JqOmcsbGV2ZWw6cC5sZXZlbH0pfWw9MDtmb3Iobj14Lmxlbmd0aDtsPG47bCsrKXtmPXhbbF07aWYoZCYmZi5sZXZlbD5kKWJyZWFrO2EuY3VycmVudFRhcmdldD1mLmVsZW07YS5kYXRhPWYuaGFuZGxlT2JqLmRhdGE7YS5oYW5kbGVPYmo9Zi5oYW5kbGVPYmo7bT1mLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShmLmVsZW0sCmFyZ3VtZW50cyk7aWYoITE9PT1tfHxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpaWYoZD1mLmxldmVsLCExPT09bSYmKGI9ITEpLGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha31yZXR1cm4gYn19ZnVuY3Rpb24gWihhLGIpe3JldHVybihhJiYiKiIhPT1hP2ErIi4iOiIiKStiLnJlcGxhY2UobGIsImAiKS5yZXBsYWNlKG1iLCJceDI2Iil9ZnVuY3Rpb24geWEoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fDExPT09YS5wYXJlbnROb2RlLm5vZGVUeXBlfWZ1bmN0aW9uIHphKGEsYixkKXtiPWJ8fDA7aWYoYy5pc0Z1bmN0aW9uKGIpKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihhLGMpe3JldHVybiEhYi5jYWxsKGEsYyxhKT09PWR9KTtpZihiLm5vZGVUeXBlKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihhLGMpe3JldHVybiBhPT09Yj09PWR9KTtpZigic3RyaW5nIj09PXR5cGVvZiBiKXt2YXIgZT1jLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gMT09PQphLm5vZGVUeXBlfSk7aWYobmIudGVzdChiKSlyZXR1cm4gYy5maWx0ZXIoYixlLCFkKTtiPWMuZmlsdGVyKGIsZSl9cmV0dXJuIGMuZ3JlcChhLGZ1bmN0aW9uKGEsZSl7cmV0dXJuIDA8PWMuaW5BcnJheShhLGIpPT09ZH0pfWZ1bmN0aW9uIG9iKGEsYil7cmV0dXJuIGMubm9kZU5hbWUoYSwidGFibGUiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIEFhKGEsYil7aWYoMT09PWIubm9kZVR5cGUmJmMuaGFzRGF0YShhKSl7dmFyIGQ9Yy5leHBhbmRvLGU9Yy5kYXRhKGEpLGY9Yy5kYXRhKGIsZSk7aWYoZT1lW2RdKWlmKGE9ZS5ldmVudHMsZj1mW2RdPWMuZXh0ZW5kKHt9LGUpLGEpe2RlbGV0ZSBmLmhhbmRsZTtmLmV2ZW50cz17fTtmb3IodmFyIGcgaW4gYSlmb3IoZD0wLGU9YVtnXS5sZW5ndGg7ZDxlO2QrKyljLmV2ZW50LmFkZChiLGcrKGFbZ11bZF0ubmFtZXNwYWNlPwoiLiI6IiIpK2FbZ11bZF0ubmFtZXNwYWNlLGFbZ11bZF0sYVtnXVtkXS5kYXRhKX19fWZ1bmN0aW9uIEJhKGEsYil7dmFyIGQ7aWYoMT09PWIubm9kZVR5cGUpe2IuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpO2IubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKTtkPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigib2JqZWN0Ij09PWQpYi5vdXRlckhUTUw9YS5vdXRlckhUTUw7ZWxzZSBpZigiaW5wdXQiPT09ZCYmKCJjaGVja2JveCI9PT1hLnR5cGV8fCJyYWRpbyI9PT1hLnR5cGUpKWEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpO2Vsc2UgaWYoIm9wdGlvbiI9PT1kKWIuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ7ZWxzZSBpZigiaW5wdXQiPT09ZHx8InRleHRhcmVhIj09PWQpYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWU7CmIucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyl9fWZ1bmN0aW9uIGFhKGEpe3JldHVybiJnZXRFbGVtZW50c0J5VGFnTmFtZSJpbiBhP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKToicXVlcnlTZWxlY3RvckFsbCJpbiBhP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIENhKGEpe2lmKCJjaGVja2JveCI9PT1hLnR5cGV8fCJyYWRpbyI9PT1hLnR5cGUpYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWR9ZnVuY3Rpb24gRGEoYSl7Yy5ub2RlTmFtZShhLCJpbnB1dCIpP0NhKGEpOiJnZXRFbGVtZW50c0J5VGFnTmFtZSJpbiBhJiZjLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxDYSl9ZnVuY3Rpb24gcGIoYSxiKXtiLnNyYz9jLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmMuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWIsIi8qJDAqLyIpKTtiLnBhcmVudE5vZGUmJgpiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gRWEoYSxiLGQpe3ZhciBlPSJ3aWR0aCI9PT1iP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZj0id2lkdGgiPT09Yj9yYjpzYjtpZigwPGUpcmV0dXJuImJvcmRlciIhPT1kJiZjLmVhY2goZixmdW5jdGlvbigpe2R8fChlLT1wYXJzZUZsb2F0KGMuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCk7ZT0ibWFyZ2luIj09PWQ/ZSsocGFyc2VGbG9hdChjLmNzcyhhLGQrdGhpcykpfHwwKTplLShwYXJzZUZsb2F0KGMuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDApfSksZSsicHgiO2U9RihhLGIsYik7aWYoMD5lfHxudWxsPT1lKWU9YS5zdHlsZVtiXXx8MDtlPXBhcnNlRmxvYXQoZSl8fDA7ZCYmYy5lYWNoKGYsZnVuY3Rpb24oKXtlKz1wYXJzZUZsb2F0KGMuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MDsicGFkZGluZyIhPT1kJiYoZSs9cGFyc2VGbG9hdChjLmNzcyhhLCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwKMCk7Im1hcmdpbiI9PT1kJiYoZSs9cGFyc2VGbG9hdChjLmNzcyhhLGQrdGhpcykpfHwwKX0pO3JldHVybiBlKyJweCJ9ZnVuY3Rpb24gRmEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsZCl7InN0cmluZyIhPT10eXBlb2YgYiYmKGQ9YixiPSIqIik7aWYoYy5pc0Z1bmN0aW9uKGQpKXtiPWIudG9Mb3dlckNhc2UoKS5zcGxpdChHYSk7Zm9yKHZhciBlPTAsZj1iLmxlbmd0aCxnLGg7ZTxmO2UrKylnPWJbZV0sKGg9L15cKy8udGVzdChnKSkmJihnPWcuc3Vic3RyKDEpfHwiKiIpLGc9YVtnXT1hW2ddfHxbXSxnW2g/InVuc2hpZnQiOiJwdXNoIl0oZCl9fX1mdW5jdGlvbiBiYShhLGIsYyxlLGYsZyl7Zj1mfHxiLmRhdGFUeXBlc1swXTtnPWd8fHt9O2dbZl09ITA7Zj1hW2ZdO2Zvcih2YXIgaD0wLGs9Zj9mLmxlbmd0aDowLGw9YT09PWphLG47aDxrJiYobHx8IW4pO2grKyluPWZbaF0oYixjLGUpLCJzdHJpbmciPT09dHlwZW9mIG4mJighbHx8Z1tuXT9uPXZvaWQgMDooYi5kYXRhVHlwZXMudW5zaGlmdChuKSwKbj1iYShhLGIsYyxlLG4sZykpKTshbCYmbnx8Z1siKiJdfHwobj1iYShhLGIsYyxlLCIqIixnKSk7cmV0dXJuIG59ZnVuY3Rpb24gSGEoYSxiKXt2YXIgZCxlLGY9Yy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGIpdm9pZCAwIT09YltkXSYmKChmW2RdP2E6ZXx8KGU9e30pKVtkXT1iW2RdKTtlJiZjLmV4dGVuZCghMCxhLGUpfWZ1bmN0aW9uIGthKGEsYixkLGUpe2lmKGMuaXNBcnJheShiKSljLmVhY2goYixmdW5jdGlvbihiLGYpe2R8fHRiLnRlc3QoYSk/ZShhLGYpOmthKGErIlsiKygib2JqZWN0Ij09PXR5cGVvZiBmfHxjLmlzQXJyYXkoZik/YjoiIikrIl0iLGYsZCxlKX0pO2Vsc2UgaWYoZHx8bnVsbD09Ynx8Im9iamVjdCIhPT10eXBlb2YgYillKGEsYik7ZWxzZSBmb3IodmFyIGYgaW4gYilrYShhKyJbIitmKyJdIixiW2ZdLGQsZSl9ZnVuY3Rpb24gSWEoKXt0cnl7cmV0dXJuIG5ldyBxLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe319ZnVuY3Rpb24gSmEoKXtzZXRUaW1lb3V0KHViLAowKTtyZXR1cm4gY2E9Yy5ub3coKX1mdW5jdGlvbiB1Yigpe2NhPXZvaWQgMH1mdW5jdGlvbiBNKGEsYil7dmFyIGQ9e307Yy5lYWNoKEthLmNvbmNhdC5hcHBseShbXSxLYS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2RbdGhpc109YX0pO3JldHVybiBkfWZ1bmN0aW9uIExhKGEpe2lmKCFsYVthXSl7dmFyIGI9bS5ib2R5LGQ9YygiXHgzYyIrYSsiXHgzZSIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKCJub25lIj09PWV8fCIiPT09ZSlBfHwoQT1tLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLEEuZnJhbWVCb3JkZXI9QS53aWR0aD1BLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKEEpLEcmJkEuY3JlYXRlRWxlbWVudHx8KEc9KEEuY29udGVudFdpbmRvd3x8QS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LEcud3JpdGUoKGMuc3VwcG9ydC5ib3hNb2RlbD8iXHgzYyFkb2N0eXBlIGh0bWxceDNlIjoiIikrIlx4M2NodG1sXHgzZVx4M2Nib2R5XHgzZSIpLApHLmNsb3NlKCkpLGQ9Ry5jcmVhdGVFbGVtZW50KGEpLEcuYm9keS5hcHBlbmRDaGlsZChkKSxlPWMuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKEEpO2xhW2FdPWV9cmV0dXJuIGxhW2FdfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBjLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9dmFyIG09cS5kb2N1bWVudCxNYT1xLm5hdmlnYXRvcix2Yj1xLmxvY2F0aW9uLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7aWYoIWIuaXNSZWFkeSl7dHJ5e20uZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYyl7c2V0VGltZW91dChhLDEpO3JldHVybn1iLnJlYWR5KCl9fXZhciBiPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIG5ldyBiLmZuLmluaXQoYSxjLGYpfSxjPXEualF1ZXJ5LGU9cS4kLGYsZz0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saD0vXFMvLGs9L15ccysvLGw9L1xzKyQvLApuPS9cZC8scD0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLFk9L15bXF0sOnt9XHNdKiQvLHg9L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyx0PS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyx3PS8oPzpefDp8LCkoPzpccypcWykrL2cseT0vKHdlYmtpdClbIFwvXShbXHcuXSspLyx6PS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyxBPS8obXNpZSkgKFtcdy5dKykvLHY9Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/LyxyPS8tKFthLXpdfFswLTldKS9pZyx3Yj0vXi1tcy0vLGRhPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LFY9TWEudXNlckFnZW50LGVhLFUseGI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxuYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LG9hPUFycmF5LnByb3RvdHlwZS5wdXNoLE89QXJyYXkucHJvdG90eXBlLnNsaWNlLApOYT1TdHJpbmcucHJvdG90eXBlLnRyaW0sdT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixIPXt9O2IuZm49Yi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmIsaW5pdDpmdW5jdGlvbihhLGMsZCl7dmFyIGU7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYoImJvZHkiPT09YSYmIWMmJm0uYm9keSlyZXR1cm4gdGhpcy5jb250ZXh0PW0sdGhpc1swXT1tLmJvZHksdGhpcy5zZWxlY3Rvcj1hLHRoaXMubGVuZ3RoPTEsdGhpcztpZigic3RyaW5nIj09PXR5cGVvZiBhKXtlPSJceDNjIj09PWEuY2hhckF0KDApJiYiXHgzZSI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmMzw9YS5sZW5ndGg/W251bGwsYSxudWxsXTpnLmV4ZWMoYSk7aWYoIWV8fCFlWzFdJiZjKXJldHVybiFjfHxjLmpxdWVyeT8oY3x8ZCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGMpLmZpbmQoYSk7aWYoZVsxXSlyZXR1cm4gZD0KKGM9YyBpbnN0YW5jZW9mIGI/Y1swXTpjKT9jLm93bmVyRG9jdW1lbnR8fGM6bSwoYT1wLmV4ZWMoYSkpP2IuaXNQbGFpbk9iamVjdChjKT8oYT1bbS5jcmVhdGVFbGVtZW50KGFbMV0pXSxiLmZuLmF0dHIuY2FsbChhLGMsITApKTphPVtkLmNyZWF0ZUVsZW1lbnQoYVsxXSldOihhPWIuYnVpbGRGcmFnbWVudChbZVsxXV0sW2RdKSxhPShhLmNhY2hlYWJsZT9iLmNsb25lKGEuZnJhZ21lbnQpOmEuZnJhZ21lbnQpLmNoaWxkTm9kZXMpLGIubWVyZ2UodGhpcyxhKTtpZigoYz1tLmdldEVsZW1lbnRCeUlkKGVbMl0pKSYmYy5wYXJlbnROb2RlKXtpZihjLmlkIT09ZVsyXSlyZXR1cm4gZC5maW5kKGEpO3RoaXMubGVuZ3RoPTE7dGhpc1swXT1jfXRoaXMuY29udGV4dD1tO3RoaXMuc2VsZWN0b3I9YTtyZXR1cm4gdGhpc31pZihiLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGQucmVhZHkoYSk7dm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9CmEuY29udGV4dCk7cmV0dXJuIGIubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS42LjQiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gTy5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT90aGlzLnRvQXJyYXkoKTowPmE/dGhpc1t0aGlzLmxlbmd0aCthXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IoKTtiLmlzQXJyYXkoYSk/b2EuYXBwbHkoZSxhKTpiLm1lcmdlKGUsYSk7ZS5wcmV2T2JqZWN0PXRoaXM7ZS5jb250ZXh0PXRoaXMuY29udGV4dDsiZmluZCI9PT1jP2Uuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2Q6YyYmKGUuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYysiKCIrZCsiKSIpO3JldHVybiBlfSxlYWNoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGIuZWFjaCh0aGlzLAphLGMpfSxyZWFkeTpmdW5jdGlvbihhKXtiLmJpbmRSZWFkeSgpO2VhLmRvbmUoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe3JldHVybi0xPT09YT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSwrYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soTy5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixPLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGIubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpvYSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX07Yi5mbi5pbml0LnByb3RvdHlwZT0KYi5mbjtiLmV4dGVuZD1iLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LHY9MSxyPWFyZ3VtZW50cy5sZW5ndGgsaD0hMTsiYm9vbGVhbiI9PT10eXBlb2YgZyYmKGg9ZyxnPWFyZ3VtZW50c1sxXXx8e30sdj0yKTsib2JqZWN0Ij09PXR5cGVvZiBnfHxiLmlzRnVuY3Rpb24oZyl8fChnPXt9KTtyPT09diYmKGc9dGhpcywtLXYpO2Zvcig7djxyO3YrKylpZihudWxsIT0oYT1hcmd1bWVudHNbdl0pKWZvcihjIGluIGEpZD1nW2NdLGU9YVtjXSxnIT09ZSYmKGgmJmUmJihiLmlzUGxhaW5PYmplY3QoZSl8fChmPWIuaXNBcnJheShlKSkpPyhmPyhmPSExLGQ9ZCYmYi5pc0FycmF5KGQpP2Q6W10pOmQ9ZCYmYi5pc1BsYWluT2JqZWN0KGQpP2Q6e30sZ1tjXT1iLmV4dGVuZChoLGQsZSkpOnZvaWQgMCE9PWUmJihnW2NdPWUpKTtyZXR1cm4gZ307Yi5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYSl7cS4kPT09YiYmKHEuJD1lKTthJiZxLmpRdWVyeT09PQpiJiYocS5qUXVlcnk9Yyk7cmV0dXJuIGJ9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/Yi5yZWFkeVdhaXQrKzpiLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7aWYoITA9PT1hJiYhLS1iLnJlYWR5V2FpdHx8ITAhPT1hJiYhYi5pc1JlYWR5KXtpZighbS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGIucmVhZHksMSk7Yi5pc1JlYWR5PSEwOyEwIT09YSYmMDwtLWIucmVhZHlXYWl0fHwoZWEucmVzb2x2ZVdpdGgobSxbYl0pLGIuZm4udHJpZ2dlciYmYihtKS50cmlnZ2VyKCJyZWFkeSIpLnVuYmluZCgicmVhZHkiKSl9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZighZWEpe2VhPWIuX0RlZmVycmVkKCk7aWYoImNvbXBsZXRlIj09PW0ucmVhZHlTdGF0ZSlyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2lmKG0uYWRkRXZlbnRMaXN0ZW5lciltLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFUsITEpLHEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsCmIucmVhZHksITEpO2Vsc2UgaWYobS5hdHRhY2hFdmVudCl7bS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixVKTtxLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGIucmVhZHkpO3ZhciBjPSExO3RyeXtjPW51bGw9PXEuZnJhbWVFbGVtZW50fWNhdGNoKGQpe31tLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYyYmYSgpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PWIudHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09Yi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmIm9iamVjdCI9PT10eXBlb2YgYSYmInNldEludGVydmFsImluIGF9LGlzTmFOOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hfHwhbi50ZXN0KGEpfHxpc05hTihhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9TdHJpbmcoYSk6SFt4Yi5jYWxsKGEpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fAoib2JqZWN0IiE9PWIudHlwZShhKXx8YS5ub2RlVHlwZXx8Yi5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIW5hLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIW5hLmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChjKXtyZXR1cm4hMX1mb3IodmFyIGQgaW4gYSk7cmV0dXJuIHZvaWQgMD09PWR8fG5hLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYTt9LHBhcnNlSlNPTjpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhfHwhYSlyZXR1cm4gbnVsbDthPWIudHJpbShhKTtpZihxLkpTT04mJnEuSlNPTi5wYXJzZSlyZXR1cm4gcS5KU09OLnBhcnNlKGEpO2lmKFkudGVzdChhLnJlcGxhY2UoeCwiQCIpLnJlcGxhY2UodCwiXSIpLnJlcGxhY2UodywiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiKwphKSkoKTtiLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYSl9LHBhcnNlWE1MOmZ1bmN0aW9uKGEpe3ZhciBjLGQ7dHJ5e3EuRE9NUGFyc2VyPyhkPW5ldyBET01QYXJzZXIsYz1kLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKTooYz1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGMuYXN5bmM9ImZhbHNlIixjLmxvYWRYTUwoYSkpfWNhdGNoKGUpe2M9dm9pZCAwfWMmJmMuZG9jdW1lbnRFbGVtZW50JiYhYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fGIuZXJyb3IoIkludmFsaWQgWE1MOiAiK2EpO3JldHVybiBjfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe2EmJmgudGVzdChhKSYmKHEuZXhlY1NjcmlwdHx8ZnVuY3Rpb24oYSl7cS5ldmFsLmNhbGwocSxhKX0pKGEpfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh3YiwibXMtIikucmVwbGFjZShyLGRhKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSwKYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PWIudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj0wLGc9YS5sZW5ndGgsdj12b2lkIDA9PT1nfHxiLmlzRnVuY3Rpb24oYSk7aWYoZClpZih2KWZvcihlIGluIGEpe2lmKCExPT09Yy5hcHBseShhW2VdLGQpKWJyZWFrfWVsc2UgZm9yKDtmPGcmJiExIT09Yy5hcHBseShhW2YrK10sZCk7KTtlbHNlIGlmKHYpZm9yKGUgaW4gYSl7aWYoITE9PT1jLmNhbGwoYVtlXSxlLGFbZV0pKWJyZWFrfWVsc2UgZm9yKDtmPGcmJiExIT09Yy5jYWxsKGFbZl0sZixhW2YrK10pOyk7cmV0dXJuIGF9LHRyaW06TmE/ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6TmEuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YS50b1N0cmluZygpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYyl7Yz1jfHxbXTtpZihudWxsIT0KYSl7dmFyIGQ9Yi50eXBlKGEpO251bGw9PWEubGVuZ3RofHwic3RyaW5nIj09PWR8fCJmdW5jdGlvbiI9PT1kfHwicmVnZXhwIj09PWR8fGIuaXNXaW5kb3coYSk/b2EuY2FsbChjLGEpOmIubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIpe2lmKCFiKXJldHVybi0xO2lmKHUpcmV0dXJuIHUuY2FsbChiLGEpO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihiW2NdPT09YSlyZXR1cm4gYztyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7aWYoIm51bWJlciI9PT10eXBlb2YgYi5sZW5ndGgpZm9yKHZhciBlPWIubGVuZ3RoO2Q8ZTtkKyspYVtjKytdPWJbZF07ZWxzZSBmb3IoO3ZvaWQgMCE9PWJbZF07KWFbYysrXT1iW2QrK107YS5sZW5ndGg9YztyZXR1cm4gYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZTtjPSEhYztmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspZT0hIWIoYVtmXSxmKSwKYyE9PWUmJmQucHVzaChhW2ZdKTtyZXR1cm4gZH0sbWFwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmLGc9W10sdj0wLHI9YS5sZW5ndGg7aWYoYSBpbnN0YW5jZW9mIGJ8fHZvaWQgMCE9PXImJiJudW1iZXIiPT09dHlwZW9mIHImJigwPHImJmFbMF0mJmFbci0xXXx8MD09PXJ8fGIuaXNBcnJheShhKSkpZm9yKDt2PHI7disrKWU9YyhhW3ZdLHYsZCksbnVsbCE9ZSYmKGdbZy5sZW5ndGhdPWUpO2Vsc2UgZm9yKGYgaW4gYSllPWMoYVtmXSxmLGQpLG51bGwhPWUmJihnW2cubGVuZ3RoXT1lKTtyZXR1cm4gZy5jb25jYXQuYXBwbHkoW10sZyl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMpe2lmKCJzdHJpbmciPT09dHlwZW9mIGMpe3ZhciBkPWFbY107Yz1hO2E9ZH1pZihiLmlzRnVuY3Rpb24oYSkpe3ZhciBlPU8uY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsZS5jb25jYXQoTy5jYWxsKGFyZ3VtZW50cykpKX07ZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fApkLmd1aWR8fGIuZ3VpZCsrO3JldHVybiBkfX0sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGUsZixnKXt2YXIgdj1hLmxlbmd0aDtpZigib2JqZWN0Ij09PXR5cGVvZiBjKXtmb3IodmFyIHIgaW4gYyliLmFjY2VzcyhhLHIsY1tyXSxlLGYsZCk7cmV0dXJuIGF9aWYodm9pZCAwIT09ZCl7ZT0hZyYmZSYmYi5pc0Z1bmN0aW9uKGQpO2ZvcihyPTA7cjx2O3IrKylmKGFbcl0sYyxlP2QuY2FsbChhW3JdLHIsZihhW3JdLGMpKTpkLGcpO3JldHVybiBhfXJldHVybiB2P2YoYVswXSxjKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSx1YU1hdGNoOmZ1bmN0aW9uKGEpe2E9YS50b0xvd2VyQ2FzZSgpO2E9eS5leGVjKGEpfHx6LmV4ZWMoYSl8fEEuZXhlYyhhKXx8MD5hLmluZGV4T2YoImNvbXBhdGlibGUiKSYmdi5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjphWzFdfHwiIix2ZXJzaW9uOmFbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYiwKYyl7cmV0dXJuIG5ldyBhLmZuLmluaXQoYixjKX1iLmV4dGVuZCghMCxhLHRoaXMpO2Euc3VwZXJjbGFzcz10aGlzO2EuZm49YS5wcm90b3R5cGU9dGhpcygpO2EuZm4uY29uc3RydWN0b3I9YTthLnN1Yj10aGlzLnN1YjthLmZuLmluaXQ9ZnVuY3Rpb24oZCxlKXtlJiZlIGluc3RhbmNlb2YgYiYmIShlIGluc3RhbmNlb2YgYSkmJihlPWEoZSkpO3JldHVybiBiLmZuLmluaXQuY2FsbCh0aGlzLGQsZSxjKX07YS5mbi5pbml0LnByb3RvdHlwZT1hLmZuO3ZhciBjPWEobSk7cmV0dXJuIGF9LGJyb3dzZXI6e319KTtiLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtIWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO1Y9Yi51YU1hdGNoKFYpO1YuYnJvd3NlciYmKGIuYnJvd3NlcltWLmJyb3dzZXJdPSEwLGIuYnJvd3Nlci52ZXJzaW9uPVYudmVyc2lvbik7Yi5icm93c2VyLndlYmtpdCYmCihiLmJyb3dzZXIuc2FmYXJpPSEwKTtoLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyk7Zj1iKG0pO20uYWRkRXZlbnRMaXN0ZW5lcj9VPWZ1bmN0aW9uKCl7bS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixVLCExKTtiLnJlYWR5KCl9Om0uYXR0YWNoRXZlbnQmJihVPWZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PW0ucmVhZHlTdGF0ZSYmKG0uZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsVSksYi5yZWFkeSgpKX0pO3JldHVybiBifSgpLHBhPSJkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UgdGhlbiBhbHdheXMgcGlwZSIuc3BsaXQoIiAiKSxPYT1bXS5zbGljZTtjLmV4dGVuZCh7X0RlZmVycmVkOmZ1bmN0aW9uKCl7dmFyIGE9W10sYixkLGUsZj17ZG9uZTpmdW5jdGlvbigpe2lmKCFlKXt2YXIgZD1hcmd1bWVudHMsaCxrLGwsbixwO2ImJihwPWIsYj0wKTtoPTA7Zm9yKGs9ZC5sZW5ndGg7aDwKaztoKyspbD1kW2hdLG49Yy50eXBlKGwpLCJhcnJheSI9PT1uP2YuZG9uZS5hcHBseShmLGwpOiJmdW5jdGlvbiI9PT1uJiZhLnB1c2gobCk7cCYmZi5yZXNvbHZlV2l0aChwWzBdLHBbMV0pfXJldHVybiB0aGlzfSxyZXNvbHZlV2l0aDpmdW5jdGlvbihjLGYpe2lmKCFlJiYhYiYmIWQpe2Y9Znx8W107ZD0xO3RyeXtmb3IoO2FbMF07KWEuc2hpZnQoKS5hcHBseShjLGYpfWZpbmFsbHl7Yj1bYyxmXSxkPTB9fXJldHVybiB0aGlzfSxyZXNvbHZlOmZ1bmN0aW9uKCl7Zi5yZXNvbHZlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGlzUmVzb2x2ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCFkJiYhYil9LGNhbmNlbDpmdW5jdGlvbigpe2U9MTthPVtdO3JldHVybiB0aGlzfX07cmV0dXJuIGZ9LERlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPWMuX0RlZmVycmVkKCksZD1jLl9EZWZlcnJlZCgpLGU7Yy5leHRlbmQoYix7dGhlbjpmdW5jdGlvbihhLGMpe2IuZG9uZShhKS5mYWlsKGMpOwpyZXR1cm4gdGhpc30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGIuZG9uZS5hcHBseShiLGFyZ3VtZW50cykuZmFpbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGZhaWw6ZC5kb25lLHJlamVjdFdpdGg6ZC5yZXNvbHZlV2l0aCxyZWplY3Q6ZC5yZXNvbHZlLGlzUmVqZWN0ZWQ6ZC5pc1Jlc29sdmVkLHBpcGU6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYy5EZWZlcnJlZChmdW5jdGlvbihlKXtjLmVhY2goe2RvbmU6W2EsInJlc29sdmUiXSxmYWlsOltkLCJyZWplY3QiXX0sZnVuY3Rpb24oYSxkKXt2YXIgZj1kWzBdLGc9ZFsxXSxtO2lmKGMuaXNGdW5jdGlvbihmKSliW2FdKGZ1bmN0aW9uKCl7aWYoKG09Zi5hcHBseSh0aGlzLGFyZ3VtZW50cykpJiZjLmlzRnVuY3Rpb24obS5wcm9taXNlKSltLnByb21pc2UoKS50aGVuKGUucmVzb2x2ZSxlLnJlamVjdCk7ZWxzZSBlW2crIldpdGgiXSh0aGlzPT09Yj9lOnRoaXMsW21dKX0pO2Vsc2UgYlthXShlW2ddKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKG51bGw9PQphKXtpZihlKXJldHVybiBlO2U9YT17fX1mb3IodmFyIGM9cGEubGVuZ3RoO2MtLTspYVtwYVtjXV09YltwYVtjXV07cmV0dXJuIGF9fSk7Yi5kb25lKGQuY2FuY2VsKS5mYWlsKGIuY2FuY2VsKTtkZWxldGUgYi5jYW5jZWw7YSYmYS5jYWxsKGIsYik7cmV0dXJuIGJ9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7ZFthXT0xPGFyZ3VtZW50cy5sZW5ndGg/T2EuY2FsbChhcmd1bWVudHMsMCk6YjstLWd8fGgucmVzb2x2ZVdpdGgoaCxPYS5jYWxsKGQsMCkpfX12YXIgZD1hcmd1bWVudHMsZT0wLGY9ZC5sZW5ndGgsZz1mLGg9MT49ZiYmYSYmYy5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpjLkRlZmVycmVkKCk7aWYoMTxmKXtmb3IoO2U8ZjtlKyspZFtlXSYmYy5pc0Z1bmN0aW9uKGRbZV0ucHJvbWlzZSk/ZFtlXS5wcm9taXNlKCkudGhlbihiKGUpLGgucmVqZWN0KTotLWc7Z3x8aC5yZXNvbHZlV2l0aChoLGQpfWVsc2UgaCE9PWEmJmgucmVzb2x2ZVdpdGgoaCwKZj9bYV06W10pO3JldHVybiBoLnByb21pc2UoKX19KTtjLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYT1tLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGI9bS5kb2N1bWVudEVsZW1lbnQsZCxlLGYsZyxoLGs7YS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKTthLmlubmVySFRNTD0iICAgXHgzY2xpbmsvXHgzZVx4M2N0YWJsZVx4M2VceDNjL3RhYmxlXHgzZVx4M2NhIGhyZWZceDNkJy9hJyBzdHlsZVx4M2QndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1OydceDNlYVx4M2MvYVx4M2VceDNjaW5wdXQgdHlwZVx4M2QnY2hlY2tib3gnL1x4M2UiO2Q9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2U9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCFkfHwhZC5sZW5ndGh8fCFlKXJldHVybnt9O2Y9bS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTtnPWYuYXBwZW5kQ2hpbGQobS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7ZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdOwpoPXtsZWFkaW5nV2hpdGVzcGFjZTozPT09YS5maXJzdENoaWxkLm5vZGVUeXBlLHRib2R5OiFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDoiL2EiPT09ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxvcGFjaXR5Oi9eMC41NSQvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjoib24iPT09ZC52YWx1ZSxvcHRTZWxlY3RlZDpnLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZToidCIhPT1hLmNsYXNzTmFtZSxzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLApyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfTtkLmNoZWNrZWQ9ITA7aC5ub0Nsb25lQ2hlY2tlZD1kLmNsb25lTm9kZSghMCkuY2hlY2tlZDtmLmRpc2FibGVkPSEwO2gub3B0RGlzYWJsZWQ9IWcuZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2gobCl7aC5kZWxldGVFeHBhbmRvPSExfSFhLmFkZEV2ZW50TGlzdGVuZXImJmEuYXR0YWNoRXZlbnQmJmEuZmlyZUV2ZW50JiYoYS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtoLm5vQ2xvbmVFdmVudD0hMX0pLGEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSk7ZD1tLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ZC52YWx1ZT0idCI7ZC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpO2gucmFkaW9WYWx1ZT0idCI9PT1kLnZhbHVlO2Quc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpO2EuYXBwZW5kQ2hpbGQoZCk7ZT1tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtlLmFwcGVuZENoaWxkKGEuZmlyc3RDaGlsZCk7CmguY2hlY2tDbG9uZT1lLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZDthLmlubmVySFRNTD0iIjthLnN0eWxlLndpZHRoPWEuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCI7Zj1tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07ZT1tLmNyZWF0ZUVsZW1lbnQoZj8iZGl2IjoiYm9keSIpO2c9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MCxiYWNrZ3JvdW5kOiJub25lIn07ZiYmYy5leHRlbmQoZyx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiItMTAwMHB4Iix0b3A6Ii0xMDAwcHgifSk7Zm9yKGsgaW4gZyllLnN0eWxlW2tdPWdba107ZS5hcHBlbmRDaGlsZChhKTtiPWZ8fGI7Yi5pbnNlcnRCZWZvcmUoZSxiLmZpcnN0Q2hpbGQpO2guYXBwZW5kQ2hlY2tlZD1kLmNoZWNrZWQ7Yy5ib3hNb2RlbD1oLmJveE1vZGVsPSJDU1MxQ29tcGF0Ij09PW0uY29tcGF0TW9kZTsiem9vbSJpbiBhLnN0eWxlJiYKKGEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixhLnN0eWxlLnpvb209MSxoLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9Mj09PWEub2Zmc2V0V2lkdGgsYS5zdHlsZS5kaXNwbGF5PSIiLGEuaW5uZXJIVE1MPSJceDNjZGl2IHN0eWxlXHgzZCd3aWR0aDo0cHg7J1x4M2VceDNjL2Rpdlx4M2UiLGguc2hyaW5rV3JhcEJsb2Nrcz0yIT09YS5vZmZzZXRXaWR0aCk7YS5pbm5lckhUTUw9Ilx4M2N0YWJsZVx4M2VceDNjdHJceDNlXHgzY3RkIHN0eWxlXHgzZCdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJ1x4M2VceDNjL3RkXHgzZVx4M2N0ZFx4M2V0XHgzYy90ZFx4M2VceDNjL3RyXHgzZVx4M2MvdGFibGVceDNlIjtmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7ZD0wPT09ZlswXS5vZmZzZXRIZWlnaHQ7ZlswXS5zdHlsZS5kaXNwbGF5PSIiO2ZbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7aC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9ZCYmMD09PWZbMF0ub2Zmc2V0SGVpZ2h0OwphLmlubmVySFRNTD0iIjttLmRlZmF1bHRWaWV3JiZtLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihkPW0uY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS53aWR0aD0iMCIsZC5zdHlsZS5tYXJnaW5SaWdodD0iMCIsYS5hcHBlbmRDaGlsZChkKSxoLnJlbGlhYmxlTWFyZ2luUmlnaHQ9MD09PShwYXJzZUludCgobS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCl8fHttYXJnaW5SaWdodDowfSkubWFyZ2luUmlnaHQsMTApfHwwKSk7ZS5pbm5lckhUTUw9IiI7Yi5yZW1vdmVDaGlsZChlKTtpZihhLmF0dGFjaEV2ZW50KWZvcihrIGlue3N1Ym1pdDoxLGNoYW5nZToxLGZvY3VzaW46MX0pYj0ib24iK2ssZD1iIGluIGEsZHx8KGEuc2V0QXR0cmlidXRlKGIsInJldHVybjsiKSxkPSJmdW5jdGlvbiI9PT10eXBlb2YgYVtiXSksaFtrKyJCdWJibGVzIl09ZDtlPWU9Zj1nPWY9ZD1hPWQ9bnVsbDtyZXR1cm4gaH0oKTt2YXIgamI9L14oPzpcey4qXH18XFsuKlxdKSQvLAppYj0vKFtBLVpdKS9nO2MuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoYy5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9jLmNhY2hlW2FbYy5leHBhbmRvXV06YVtjLmV4cGFuZG9dO3JldHVybiEhYSYmIUwoYSl9LGRhdGE6ZnVuY3Rpb24oYSxiLGQsZSl7aWYoYy5hY2NlcHREYXRhKGEpKXt2YXIgZj1jLmV4cGFuZG8sZz0ic3RyaW5nIj09PXR5cGVvZiBiLGg9YS5ub2RlVHlwZSxrPWg/Yy5jYWNoZTphLGw9aD9hW2MuZXhwYW5kb106YVtjLmV4cGFuZG9dJiZjLmV4cGFuZG87aWYoISghbHx8ZSYmbCYma1tsXSYmIWtbbF1bZl0pfHwhZ3x8dm9pZCAwIT09ZCl7bHx8KGg/YVtjLmV4cGFuZG9dPWw9KytjLnV1aWQ6bD1jLmV4cGFuZG8pOwprW2xdfHwoa1tsXT17fSxofHwoa1tsXS50b0pTT049Yy5ub29wKSk7aWYoIm9iamVjdCI9PT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09PXR5cGVvZiBiKWU/a1tsXVtmXT1jLmV4dGVuZChrW2xdW2ZdLGIpOmtbbF09Yy5leHRlbmQoa1tsXSxiKTthPWtbbF07ZSYmKGFbZl18fChhW2ZdPXt9KSxhPWFbZl0pO3ZvaWQgMCE9PWQmJihhW2MuY2FtZWxDYXNlKGIpXT1kKTtpZigiZXZlbnRzIj09PWImJiFhW2JdKXJldHVybiBhW2ZdJiZhW2ZdLmV2ZW50cztnPyhkPWFbYl0sbnVsbD09ZCYmKGQ9YVtjLmNhbWVsQ2FzZShiKV0pKTpkPWE7cmV0dXJuIGR9fX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsZCl7aWYoYy5hY2NlcHREYXRhKGEpKXt2YXIgZSxmPWMuZXhwYW5kbyxnPWEubm9kZVR5cGUsaD1nP2MuY2FjaGU6YSxrPWc/YVtjLmV4cGFuZG9dOmMuZXhwYW5kbztpZihoW2tdKXtpZihiJiYoZT1kP2hba11bZl06aFtrXSkmJihlW2JdfHwoYj1jLmNhbWVsQ2FzZShiKSksZGVsZXRlIGVbYl0sCiFMKGUpKXx8ZCYmKGRlbGV0ZSBoW2tdW2ZdLCFMKGhba10pKSlyZXR1cm47Yj1oW2tdW2ZdO2Muc3VwcG9ydC5kZWxldGVFeHBhbmRvfHwhaC5zZXRJbnRlcnZhbD9kZWxldGUgaFtrXTpoW2tdPW51bGw7Yj8oaFtrXT17fSxnfHwoaFtrXS50b0pTT049Yy5ub29wKSxoW2tdW2ZdPWIpOmcmJihjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYVtjLmV4cGFuZG9dOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk6YVtjLmV4cGFuZG9dPW51bGwpfX19LF9kYXRhOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kYXRhKGEsYixkLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1jLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuISghMD09PWJ8fGEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIikhPT1iKX1yZXR1cm4hMH19KTtjLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGIpe3ZhciBkPQpudWxsO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGEpe2lmKHRoaXMubGVuZ3RoJiYoZD1jLmRhdGEodGhpc1swXSksMT09PXRoaXNbMF0ubm9kZVR5cGUpKWZvcih2YXIgZT10aGlzWzBdLmF0dHJpYnV0ZXMsZixnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXS5uYW1lLDA9PT1mLmluZGV4T2YoImRhdGEtIikmJihmPWMuY2FtZWxDYXNlKGYuc3Vic3RyaW5nKDUpKSxEKHRoaXNbMF0sZixkW2ZdKSk7cmV0dXJuIGR9aWYoIm9iamVjdCI9PT10eXBlb2YgYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kYXRhKHRoaXMsYSl9KTt2YXIgaz1hLnNwbGl0KCIuIik7a1sxXT1rWzFdPyIuIitrWzFdOiIiO3JldHVybiB2b2lkIDA9PT1iPyhkPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2tbMV0rIiEiLFtrWzBdXSksdm9pZCAwPT09ZCYmdGhpcy5sZW5ndGgmJihkPWMuZGF0YSh0aGlzWzBdLGEpLGQ9RCh0aGlzWzBdLGEsZCkpLHZvaWQgMD09PWQmJmtbMV0/dGhpcy5kYXRhKGtbMF0pOgpkKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1jKHRoaXMpLGU9W2tbMF0sYl07ZC50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIra1sxXSsiISIsZSk7Yy5kYXRhKHRoaXMsYSxiKTtkLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitrWzFdKyIhIixlKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pO2MuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsYy5kYXRhKGEsYiwoYy5kYXRhKGEsYix2b2lkIDAsITApfHwwKSsxLCEwKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxiLGQpeyEwIT09YSYmKGQ9YixiPWEsYT0hMSk7aWYoYil7ZD1kfHwiZngiO3ZhciBlPWQrIm1hcmsiOyhhPWE/MDooYy5kYXRhKGIsZSx2b2lkIDAsITApfHwxKS0xKT9jLmRhdGEoYixlLGEsITApOihjLnJlbW92ZURhdGEoYixlLCEwKSx3YShiLGQsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLApiLGQpe2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSI7dmFyIGU9Yy5kYXRhKGEsYix2b2lkIDAsITApO2QmJighZXx8Yy5pc0FycmF5KGQpP2U9Yy5kYXRhKGEsYixjLm1ha2VBcnJheShkKSwhMCk6ZS5wdXNoKGQpKTtyZXR1cm4gZXx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBkPWMucXVldWUoYSxiKSxlPWQuc2hpZnQoKTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1kLnNoaWZ0KCkpO2UmJigiZngiPT09YiYmZC51bnNoaWZ0KCJpbnByb2dyZXNzIiksZS5jYWxsKGEsZnVuY3Rpb24oKXtjLmRlcXVldWUoYSxiKX0pKTtkLmxlbmd0aHx8KGMucmVtb3ZlRGF0YShhLGIrInF1ZXVlIiwhMCksd2EoYSxiLCJxdWV1ZSIpKX19KTtjLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXsic3RyaW5nIiE9PXR5cGVvZiBhJiYoYj1hLGE9ImZ4Iik7cmV0dXJuIHZvaWQgMD09PWI/Yy5xdWV1ZSh0aGlzWzBdLGEpOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWMucXVldWUodGhpcywKYSxiKTsiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09ZFswXSYmYy5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWMuZng/Yy5meC5zcGVlZHNbYV18fGE6YTtiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbigpe3ZhciBkPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2MuZGVxdWV1ZShkLGIpfSxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZCgpey0tZ3x8ZS5yZXNvbHZlV2l0aChmLFtmXSl9InN0cmluZyIhPT10eXBlb2YgYSYmKGE9dm9pZCAwKTthPWF8fCJmeCI7dmFyIGU9Yy5EZWZlcnJlZCgpLGY9dGhpcztiPWYubGVuZ3RoO3ZhciBnPTEsaD1hKyJkZWZlciIsaz1hKyJxdWV1ZSI7YSs9Im1hcmsiOwpmb3IodmFyIGw7Yi0tOylpZihsPWMuZGF0YShmW2JdLGgsdm9pZCAwLCEwKXx8KGMuZGF0YShmW2JdLGssdm9pZCAwLCEwKXx8Yy5kYXRhKGZbYl0sYSx2b2lkIDAsITApKSYmYy5kYXRhKGZbYl0saCxjLl9EZWZlcnJlZCgpLCEwKSlnKyssbC5kb25lKGQpO2QoKTtyZXR1cm4gZS5wcm9taXNlKCl9fSk7dmFyIFBhPS9bXG5cdFxyXS9nLHFhPS9ccysvLHliPS9cci9nLHpiPS9eKD86YnV0dG9ufGlucHV0KSQvaSxBYj0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxCYj0vXmEoPzpyZWEpPyQvaSxRYT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSxJLFJhO2MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuYWNjZXNzKHRoaXMsYSxiLCEwLGMuYXR0cil9LApyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZUF0dHIodGhpcyxhKX0pfSxwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuYWNjZXNzKHRoaXMsYSxiLCEwLGMucHJvcCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7YT1jLnByb3BGaXhbYV18fGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmLGcsaCxrO2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2ModGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmInN0cmluZyI9PT10eXBlb2YgYSlmb3IoYj1hLnNwbGl0KHFhKSxkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKWlmKGY9dGhpc1tkXSwxPT09Zi5ub2RlVHlwZSlpZihmLmNsYXNzTmFtZXx8MSE9PQpiLmxlbmd0aCl7Zz0iICIrZi5jbGFzc05hbWUrIiAiO2g9MDtmb3Ioaz1iLmxlbmd0aDtoPGs7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtmLmNsYXNzTmFtZT1jLnRyaW0oZyl9ZWxzZSBmLmNsYXNzTmFtZT1hO3JldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixkLGUsZixnLGgsaztpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJiJzdHJpbmciPT09dHlwZW9mIGF8fHZvaWQgMD09PWEpZm9yKGI9KGF8fCIiKS5zcGxpdChxYSksZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKylpZihmPXRoaXNbZF0sMT09PWYubm9kZVR5cGUmJmYuY2xhc3NOYW1lKWlmKGEpe2c9KCIgIitmLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoUGEsIiAiKTtoPTA7Zm9yKGs9Yi5sZW5ndGg7aDxrO2grKylnPWcucmVwbGFjZSgiICIrCmJbaF0rIiAiLCIgIik7Zi5jbGFzc05hbWU9Yy50cmltKGcpfWVsc2UgZi5jbGFzc05hbWU9IiI7cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGEsZT0iYm9vbGVhbiI9PT10eXBlb2YgYjtyZXR1cm4gYy5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihkKXtjKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGQsdGhpcy5jbGFzc05hbWUsYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtpZigic3RyaW5nIj09PWQpZm9yKHZhciBmLGc9MCxoPWModGhpcyksaz1iLGw9YS5zcGxpdChxYSk7Zj1sW2crK107KWs9ZT9rOiFoLmhhc0NsYXNzKGYpLGhbaz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGYpO2Vsc2UgaWYoInVuZGVmaW5lZCI9PT1kfHwiYm9vbGVhbiI9PT1kKXRoaXMuY2xhc3NOYW1lJiZjLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8CiExPT09YT8iIjpjLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsYz10aGlzLmxlbmd0aDtiPGM7YisrKWlmKDE9PT10aGlzW2JdLm5vZGVUeXBlJiYtMTwoIiAiK3RoaXNbYl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShQYSwiICIpLmluZGV4T2YoYSkpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYixkLGU9dGhpc1swXTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZj1jLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZT1jKHRoaXMpOzE9PT10aGlzLm5vZGVUeXBlJiYoZD1mP2EuY2FsbCh0aGlzLGQsZS52YWwoKSk6YSxudWxsPT1kP2Q9IiI6Im51bWJlciI9PT10eXBlb2YgZD9kKz0iIjpjLmlzQXJyYXkoZCkmJihkPWMubWFwKGQsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPWMudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8CmMudmFsSG9va3NbdGhpcy50eXBlXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZCwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZCkpfSl9aWYoZSl7aWYoKGI9Yy52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldfHxjLnZhbEhvb2tzW2UudHlwZV0pJiYiZ2V0ImluIGImJnZvaWQgMCE9PShkPWIuZ2V0KGUsInZhbHVlIikpKXJldHVybiBkO2Q9ZS52YWx1ZTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2QucmVwbGFjZSh5YiwiIik6bnVsbD09ZD8iIjpkfX19KTtjLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixkPWEuc2VsZWN0ZWRJbmRleCxlPVtdLGY9YS5vcHRpb25zO2E9InNlbGVjdC1vbmUiPT09YS50eXBlO2lmKDA+ZClyZXR1cm4gbnVsbDtmb3IodmFyIGc9CmE/ZDowLGg9YT9kKzE6Zi5sZW5ndGg7ZzxoO2crKylpZihiPWZbZ10sISghYi5zZWxlY3RlZHx8KGMuc3VwcG9ydC5vcHREaXNhYmxlZD9iLmRpc2FibGVkOm51bGwhPT1iLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fGIucGFyZW50Tm9kZS5kaXNhYmxlZCYmYy5ub2RlTmFtZShiLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtiPWMoYikudmFsKCk7aWYoYSlyZXR1cm4gYjtlLnB1c2goYil9cmV0dXJuIGEmJiFlLmxlbmd0aCYmZi5sZW5ndGg/YyhmW2RdKS52YWwoKTplfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLm1ha2VBcnJheShiKTtjKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPTA8PWMuaW5BcnJheShjKHRoaXMpLnZhbCgpLGQpfSk7ZC5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBkfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSwKYXR0ckZpeDp7dGFiaW5kZXg6InRhYkluZGV4In0sYXR0cjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLm5vZGVUeXBlO2lmKGEmJjMhPT1mJiY4IT09ZiYmMiE9PWYpe2lmKGUmJmIgaW4gYy5hdHRyRm4pcmV0dXJuIGMoYSlbYl0oZCk7aWYoISgiZ2V0QXR0cmlidXRlImluIGEpKXJldHVybiBjLnByb3AoYSxiLGQpO3ZhciBnLGg7aWYoZT0xIT09Znx8IWMuaXNYTUxEb2MoYSkpYj1jLmF0dHJGaXhbYl18fGIsKGg9Yy5hdHRySG9va3NbYl0pfHwoUWEudGVzdChiKT9oPVJhOkkmJihoPUkpKTtpZih2b2lkIDAhPT1kKXtpZihudWxsPT09ZCl7Yy5yZW1vdmVBdHRyKGEsYik7cmV0dXJufWlmKGgmJiJzZXQiaW4gaCYmZSYmdm9pZCAwIT09KGc9aC5zZXQoYSxkLGIpKSlyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShiLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmZSYmbnVsbCE9PShnPWguZ2V0KGEsYikpKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIG51bGw9PT0KZz92b2lkIDA6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgZDsxPT09YS5ub2RlVHlwZSYmKGI9Yy5hdHRyRml4W2JdfHxiLGMuYXR0cihhLGIsIiIpLGEucmVtb3ZlQXR0cmlidXRlKGIpLFFhLnRlc3QoYikmJihkPWMucHJvcEZpeFtiXXx8YilpbiBhJiYoYVtkXT0hMSkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKHpiLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSljLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFjLnN1cHBvcnQucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJmMubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGQ9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYik7ZCYmKGEudmFsdWU9ZCk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBJJiZjLm5vZGVOYW1lKGEsImJ1dHRvbiIpP0kuZ2V0KGEsYik6YiBpbiBhP2EudmFsdWU6bnVsbH0sCnNldDpmdW5jdGlvbihhLGIsZCl7aWYoSSYmYy5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gSS5zZXQoYSxiLGQpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEubm9kZVR5cGU7aWYoYSYmMyE9PWUmJjghPT1lJiYyIT09ZSl7dmFyIGYsZzsxPT09ZSYmYy5pc1hNTERvYyhhKXx8KGI9Yy5wcm9wRml4W2JdfHxiLGc9Yy5wcm9wSG9va3NbYl0pO3JldHVybiB2b2lkIDAhPT0KZD9nJiYic2V0ImluIGcmJnZvaWQgMCE9PShmPWcuc2V0KGEsZCxiKSk/ZjphW2JdPWQ6ZyYmImdldCJpbiBnJiZudWxsIT09KGY9Zy5nZXQoYSxiKSk/ZjphW2JdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYiYmYi5zcGVjaWZpZWQ/cGFyc2VJbnQoYi52YWx1ZSwxMCk6QWIudGVzdChhLm5vZGVOYW1lKXx8QmIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6dm9pZCAwfX19fSk7Yy5hdHRySG9va3MudGFiSW5kZXg9Yy5wcm9wSG9va3MudGFiSW5kZXg7UmE9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBkO3JldHVybiEwPT09Yy5wcm9wKGEsYil8fChkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiExIT09ZC5ub2RlVmFsdWU/Yi50b0xvd2VyQ2FzZSgpOnZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYixkKXshMT09PWI/Yy5yZW1vdmVBdHRyKGEsZCk6KGI9Yy5wcm9wRml4W2RdfHxkLApiIGluIGEmJihhW2JdPSEwKSxhLnNldEF0dHJpYnV0ZShkLGQudG9Mb3dlckNhc2UoKSkpO3JldHVybiBkfX07Yy5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZXx8KEk9Yy52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGIpe3JldHVybihhPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09YS5ub2RlVmFsdWU/YS5ub2RlVmFsdWU6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtlfHwoZT1tLmNyZWF0ZUF0dHJpYnV0ZShjKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sYy5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2MuYXR0ckhvb2tzW2JdPWMuZXh0ZW5kKGMuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZigiIj09PWMpcmV0dXJuIGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjfX0pfSkpO2Muc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Yy5lYWNoKFsiaHJlZiIsCiJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Yy5hdHRySG9va3NbYl09Yy5leHRlbmQoYy5hdHRySG9va3NbYl0se2dldDpmdW5jdGlvbihhKXthPWEuZ2V0QXR0cmlidXRlKGIsMik7cmV0dXJuIG51bGw9PT1hP3ZvaWQgMDphfX0pfSk7Yy5zdXBwb3J0LnN0eWxlfHwoYy5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pO2Muc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGMucHJvcEhvb2tzLnNlbGVjdGVkPWMuZXh0ZW5kKGMucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7aWYoYT1hLnBhcmVudE5vZGUpYS5zZWxlY3RlZEluZGV4LGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIG51bGx9fSkpO2Muc3VwcG9ydC5jaGVja09ufHxjLmVhY2goWyJyYWRpbyIsCiJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Yy52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfX19KTtjLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtjLnZhbEhvb2tzW3RoaXNdPWMuZXh0ZW5kKGMudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGMuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPTA8PWMuaW5BcnJheShjKGEpLnZhbCgpLGIpfX0pfSk7dmFyIGlhPS9cLiguKikkLyxyYT0vXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksbGI9L1wuL2csbWI9LyAvZyxDYj0vW15cd1xzLnxgXS9nLERiPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoQ2IsIlxcJFx4MjYiKX07Yy5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYixkLGUpe2lmKDMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSl7aWYoITE9PT1kKWQ9RTtlbHNlIGlmKCFkKXJldHVybjsKdmFyIGYsZztkLmhhbmRsZXImJihmPWQsZD1mLmhhbmRsZXIpO2QuZ3VpZHx8KGQuZ3VpZD1jLmd1aWQrKyk7aWYoZz1jLl9kYXRhKGEpKXt2YXIgaD1nLmV2ZW50cyxrPWcuaGFuZGxlO2h8fChnLmV2ZW50cz1oPXt9KTtrfHwoZy5oYW5kbGU9az1mdW5jdGlvbihhKXtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBjfHxhJiZjLmV2ZW50LnRyaWdnZXJlZD09PWEudHlwZT92b2lkIDA6Yy5ldmVudC5oYW5kbGUuYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9KTtrLmVsZW09YTtiPWIuc3BsaXQoIiAiKTtmb3IodmFyIGwsbj0wLHA7bD1iW24rK107KXtnPWY/Yy5leHRlbmQoe30sZik6e2hhbmRsZXI6ZCxkYXRhOmV9Oy0xPGwuaW5kZXhPZigiLiIpPyhwPWwuc3BsaXQoIi4iKSxsPXAuc2hpZnQoKSxnLm5hbWVzcGFjZT1wLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIikpOihwPVtdLGcubmFtZXNwYWNlPSIiKTtnLnR5cGU9bDtnLmd1aWR8fChnLmd1aWQ9ZC5ndWlkKTt2YXIgbT1oW2xdLApxPWMuZXZlbnQuc3BlY2lhbFtsXXx8e307bXx8KG09aFtsXT1bXSxxLnNldHVwJiYhMSE9PXEuc2V0dXAuY2FsbChhLGUscCxrKXx8KGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobCxrLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxrKSkpO3EuYWRkJiYocS5hZGQuY2FsbChhLGcpLGcuaGFuZGxlci5ndWlkfHwoZy5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSk7bS5wdXNoKGcpO2MuZXZlbnQuZ2xvYmFsW2xdPSEwfWE9bnVsbH19fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixkLGUpe2lmKDMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSl7ITE9PT1kJiYoZD1FKTt2YXIgZixnLGg9MCxrLGwsbixwLG0scSx0PWMuaGFzRGF0YShhKSYmYy5fZGF0YShhKSx3PXQmJnQuZXZlbnRzO2lmKHQmJncpaWYoYiYmYi50eXBlJiYoZD1iLmhhbmRsZXIsYj1iLnR5cGUpLCFifHwic3RyaW5nIj09PXR5cGVvZiBiJiYiLiI9PT1iLmNoYXJBdCgwKSlmb3IoZiBpbiBiPQpifHwiIix3KWMuZXZlbnQucmVtb3ZlKGEsZitiKTtlbHNle2ZvcihiPWIuc3BsaXQoIiAiKTtmPWJbaCsrXTspaWYocD1mLGs9MD5mLmluZGV4T2YoIi4iKSxsPVtdLGt8fChsPWYuc3BsaXQoIi4iKSxmPWwuc2hpZnQoKSxuPW5ldyBSZWdFeHAoIihefFxcLikiK2MubWFwKGwuc2xpY2UoMCkuc29ydCgpLERiKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKSksbT13W2ZdKWlmKGQpe3A9Yy5ldmVudC5zcGVjaWFsW2ZdfHx7fTtmb3IoZz1lfHwwO2c8bS5sZW5ndGg7ZysrKWlmKHE9bVtnXSxkLmd1aWQ9PT1xLmd1aWQpe2lmKGt8fG4udGVzdChxLm5hbWVzcGFjZSkpbnVsbD09ZSYmbS5zcGxpY2UoZy0tLDEpLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEscSk7aWYobnVsbCE9ZSlicmVha31pZigwPT09bS5sZW5ndGh8fG51bGwhPWUmJjE9PT1tLmxlbmd0aClwLnRlYXJkb3duJiYhMSE9PXAudGVhcmRvd24uY2FsbChhLGwpfHxjLnJlbW92ZUV2ZW50KGEsZix0LmhhbmRsZSksCmRlbGV0ZSB3W2ZdfWVsc2UgZm9yKGc9MDtnPG0ubGVuZ3RoO2crKylpZihxPW1bZ10sa3x8bi50ZXN0KHEubmFtZXNwYWNlKSljLmV2ZW50LnJlbW92ZShhLHAscS5oYW5kbGVyLGcpLG0uc3BsaWNlKGctLSwxKTtpZihjLmlzRW1wdHlPYmplY3Qodykpe2lmKGI9dC5oYW5kbGUpYi5lbGVtPW51bGw7ZGVsZXRlIHQuZXZlbnRzO2RlbGV0ZSB0LmhhbmRsZTtjLmlzRW1wdHlPYmplY3QodCkmJmMucmVtb3ZlRGF0YShhLHZvaWQgMCwhMCl9fX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLnR5cGV8fGEsZz1bXSxoOzA8PWYuaW5kZXhPZigiISIpJiYoZj1mLnNsaWNlKDAsLTEpLGg9ITApOzA8PWYuaW5kZXhPZigiLiIpJiYoZz1mLnNwbGl0KCIuIiksZj1nLnNoaWZ0KCksZy5zb3J0KCkpO2lmKGQmJiFjLmV2ZW50LmN1c3RvbUV2ZW50W2ZdfHxjLmV2ZW50Lmdsb2JhbFtmXSl7YT0KIm9iamVjdCI9PT10eXBlb2YgYT9hW2MuZXhwYW5kb10/YTpuZXcgYy5FdmVudChmLGEpOm5ldyBjLkV2ZW50KGYpO2EudHlwZT1mO2EuZXhjbHVzaXZlPWg7YS5uYW1lc3BhY2U9Zy5qb2luKCIuIik7YS5uYW1lc3BhY2VfcmU9bmV3IFJlZ0V4cCgiKF58XFwuKSIrZy5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTtpZihlfHwhZClhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKTtpZighZCljLmVhY2goYy5jYWNoZSxmdW5jdGlvbigpe3ZhciBkPXRoaXNbYy5leHBhbmRvXTtkJiZkLmV2ZW50cyYmZC5ldmVudHNbZl0mJmMuZXZlbnQudHJpZ2dlcihhLGIsZC5oYW5kbGUuZWxlbSl9KTtlbHNlIGlmKDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSl7YS5yZXN1bHQ9dm9pZCAwO2EudGFyZ2V0PWQ7Yj1udWxsIT1iP2MubWFrZUFycmF5KGIpOltdO2IudW5zaGlmdChhKTtnPWQ7ZT0wPmYuaW5kZXhPZigiOiIpPyJvbiIrZjoiIjtkbyBoPWMuX2RhdGEoZywKImhhbmRsZSIpLGEuY3VycmVudFRhcmdldD1nLGgmJmguYXBwbHkoZyxiKSxlJiZjLmFjY2VwdERhdGEoZykmJmdbZV0mJiExPT09Z1tlXS5hcHBseShnLGIpJiYoYS5yZXN1bHQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKSxnPWcucGFyZW50Tm9kZXx8Zy5vd25lckRvY3VtZW50fHxnPT09YS50YXJnZXQub3duZXJEb2N1bWVudCYmcTt3aGlsZShnJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKTtpZighYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGssZz1jLmV2ZW50LnNwZWNpYWxbZl18fHt9O2lmKCEoZy5fZGVmYXVsdCYmITEhPT1nLl9kZWZhdWx0LmNhbGwoZC5vd25lckRvY3VtZW50LGEpfHwiY2xpY2siPT09ZiYmYy5ub2RlTmFtZShkLCJhIikpJiZjLmFjY2VwdERhdGEoZCkpe3RyeXtlJiZkW2ZdJiYoKGs9ZFtlXSkmJihkW2VdPW51bGwpLGMuZXZlbnQudHJpZ2dlcmVkPWYsZFtmXSgpKX1jYXRjaChsKXt9ayYmKGRbZV09ayk7Yy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwfX1yZXR1cm4gYS5yZXN1bHR9fX0sCmhhbmRsZTpmdW5jdGlvbihhKXthPWMuZXZlbnQuZml4KGF8fHEuZXZlbnQpO3ZhciBiPSgoYy5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2EudHlwZV18fFtdKS5zbGljZSgwKSxkPSFhLmV4Y2x1c2l2ZSYmIWEubmFtZXNwYWNlLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO2VbMF09YTthLmN1cnJlbnRUYXJnZXQ9dGhpcztmb3IodmFyIGY9MCxnPWIubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWJbZl07aWYoZHx8YS5uYW1lc3BhY2VfcmUudGVzdChoLm5hbWVzcGFjZSkpaWYoYS5oYW5kbGVyPWguaGFuZGxlcixhLmRhdGE9aC5kYXRhLGEuaGFuZGxlT2JqPWgsaD1oLmhhbmRsZXIuYXBwbHkodGhpcyxlKSx2b2lkIDAhPT1oJiYoYS5yZXN1bHQ9aCwhMT09PWgmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpLGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha31yZXR1cm4gYS5yZXN1bHR9LHByb3BzOiJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbGF5ZXJYIGxheWVyWSBtZXRhS2V5IG5ld1ZhbHVlIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKZml4OmZ1bmN0aW9uKGEpe2lmKGFbYy5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYj1hO2E9Yy5FdmVudChiKTtmb3IodmFyIGQ9dGhpcy5wcm9wcy5sZW5ndGgsZTtkOyllPXRoaXMucHJvcHNbLS1kXSxhW2VdPWJbZV07YS50YXJnZXR8fChhLnRhcmdldD1hLnNyY0VsZW1lbnR8fG0pOzM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpOyFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQmJihhLnJlbGF0ZWRUYXJnZXQ9YS5mcm9tRWxlbWVudD09PWEudGFyZ2V0P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQpO251bGw9PWEucGFnZVgmJm51bGwhPWEuY2xpZW50WCYmKGQ9YS50YXJnZXQub3duZXJEb2N1bWVudHx8bSxiPWQuZG9jdW1lbnRFbGVtZW50LGQ9ZC5ib2R5LGEucGFnZVg9YS5jbGllbnRYKyhiJiZiLnNjcm9sbExlZnR8fGQmJmQuc2Nyb2xsTGVmdHx8MCktKGImJmIuY2xpZW50TGVmdHx8ZCYmZC5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPQphLmNsaWVudFkrKGImJmIuc2Nyb2xsVG9wfHxkJiZkLnNjcm9sbFRvcHx8MCktKGImJmIuY2xpZW50VG9wfHxkJiZkLmNsaWVudFRvcHx8MCkpO251bGwhPWEud2hpY2h8fG51bGw9PWEuY2hhckNvZGUmJm51bGw9PWEua2V5Q29kZXx8KGEud2hpY2g9bnVsbCE9YS5jaGFyQ29kZT9hLmNoYXJDb2RlOmEua2V5Q29kZSk7IWEubWV0YUtleSYmYS5jdHJsS2V5JiYoYS5tZXRhS2V5PWEuY3RybEtleSk7YS53aGljaHx8dm9pZCAwPT09YS5idXR0b258fChhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjApO3JldHVybiBhfSxndWlkOjFFOCxwcm94eTpjLnByb3h5LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpjLmJpbmRSZWFkeSx0ZWFyZG93bjpjLm5vb3B9LGxpdmU6e2FkZDpmdW5jdGlvbihhKXtjLmV2ZW50LmFkZCh0aGlzLFooYS5vcmlnVHlwZSxhLnNlbGVjdG9yKSxjLmV4dGVuZCh7fSxhLHtoYW5kbGVyOmtiLGd1aWQ6YS5oYW5kbGVyLmd1aWR9KSl9LApyZW1vdmU6ZnVuY3Rpb24oYSl7Yy5ldmVudC5yZW1vdmUodGhpcyxaKGEub3JpZ1R5cGUsYS5zZWxlY3RvciksYSl9fSxiZWZvcmV1bmxvYWQ6e2FtYXpvbk9yaWdpbmFsOm51bGwsc2V0dXA6ZnVuY3Rpb24oYSxiLGQpe2lmKGMuaXNXaW5kb3codGhpcykpe3ZhciBlPWZ1bmN0aW9uKCl7fTsiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMub25iZWZvcmV1bmxvYWQmJihlPWMuZXZlbnQuc3BlY2lhbC5iZWZvcmV1bmxvYWQuYW1hem9uT3JpZ2luYWw9dGhpcy5vbmJlZm9yZXVubG9hZCk7dGhpcy5vbmJlZm9yZXVubG9hZD1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ZS5hcHBseSh0aGlzLGEpO2QuYXBwbHkodGhpcyxhKX19fSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9Yy5ldmVudC5zcGVjaWFsLmJlZm9yZXVubG9hZC5hbWF6b25PcmlnaW5hbH19fX07Yy5yZW1vdmVFdmVudD1tLnJlbW92ZUV2ZW50TGlzdGVuZXI/CmZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9O2MuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGMuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHwhMT09PWEucmV0dXJuVmFsdWV8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9YOkUpOnRoaXMudHlwZT1hO2ImJmMuZXh0ZW5kKHRoaXMsYik7dGhpcy50aW1lU3RhbXA9Yy5ub3coKTt0aGlzW2MuZXhwYW5kb109ITB9O2MuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPQpYO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9WDt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7YSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1YO3RoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpFLGlzUHJvcGFnYXRpb25TdG9wcGVkOkUsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6RX07dmFyIFNhPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVsYXRlZFRhcmdldCxkPSExLGU9YS50eXBlO2EudHlwZT1hLmRhdGE7YiE9PXRoaXMmJihiJiYoZD1jLmNvbnRhaW5zKHRoaXMsCmIpKSxkfHwoYy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1lKSl9LFRhPWZ1bmN0aW9uKGEpe2EudHlwZT1hLmRhdGE7Yy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2MuZXZlbnQuc3BlY2lhbFthXT17c2V0dXA6ZnVuY3Rpb24oZCl7Yy5ldmVudC5hZGQodGhpcyxiLGQmJmQuc2VsZWN0b3I/VGE6U2EsYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2MuZXZlbnQucmVtb3ZlKHRoaXMsYixhJiZhLnNlbGVjdG9yP1RhOlNhKX19fSk7Yy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChjLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbihhLGIpe2lmKGMubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2MuZXZlbnQuYWRkKHRoaXMsImNsaWNrLnNwZWNpYWxTdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPQphLnRhcmdldCxmPWMubm9kZU5hbWUoYiwiaW5wdXQiKXx8Yy5ub2RlTmFtZShiLCJidXR0b24iKT9iLnR5cGU6IiI7InN1Ym1pdCIhPT1mJiYiaW1hZ2UiIT09Znx8IWMoYikuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aHx8eGEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSk7Yy5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZj1jLm5vZGVOYW1lKGIsImlucHV0Iil8fGMubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi50eXBlOiIiOyJ0ZXh0IiE9PWYmJiJwYXNzd29yZCIhPT1mfHwhYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RofHwxMyE9PWEua2V5Q29kZXx8eGEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsU3VibWl0Iil9fSk7aWYoIWMuc3VwcG9ydC5jaGFuZ2VCdWJibGVzKXt2YXIgVyxVYT1mdW5jdGlvbihhKXt2YXIgYj0KYy5ub2RlTmFtZShhLCJpbnB1dCIpP2EudHlwZToiIixkPWEudmFsdWU7InJhZGlvIj09PWJ8fCJjaGVja2JveCI9PT1iP2Q9YS5jaGVja2VkOiJzZWxlY3QtbXVsdGlwbGUiPT09Yj9kPS0xPGEuc2VsZWN0ZWRJbmRleD9jLm1hcChhLm9wdGlvbnMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2VsZWN0ZWR9KS5qb2luKCItIik6IiI6Yy5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGQ9YS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gZH0sZmE9ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnRhcmdldCxlLGY7cmEudGVzdChkLm5vZGVOYW1lKSYmIWQucmVhZE9ubHkmJihlPWMuX2RhdGEoZCwiX2NoYW5nZV9kYXRhIiksZj1VYShkKSwiZm9jdXNvdXQiPT09YS50eXBlJiYicmFkaW8iPT09ZC50eXBlfHxjLl9kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsZiksdm9pZCAwPT09ZXx8Zj09PWV8fG51bGw9PWUmJiFmfHwoYS50eXBlPSJjaGFuZ2UiLGEubGl2ZUZpcmVkPXZvaWQgMCxjLmV2ZW50LnRyaWdnZXIoYSxiLApkKSkpfTtjLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDpmYSxiZWZvcmVkZWFjdGl2YXRlOmZhLGNsaWNrOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yy5ub2RlTmFtZShiLCJpbnB1dCIpP2IudHlwZToiIjsoInJhZGlvIj09PWR8fCJjaGVja2JveCI9PT1kfHxjLm5vZGVOYW1lKGIsInNlbGVjdCIpKSYmZmEuY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yy5ub2RlTmFtZShiLCJpbnB1dCIpP2IudHlwZToiIjsoMTM9PT1hLmtleUNvZGUmJiFjLm5vZGVOYW1lKGIsInRleHRhcmVhIil8fDMyPT09YS5rZXlDb2RlJiYoImNoZWNrYm94Ij09PWR8fCJyYWRpbyI9PT1kKXx8InNlbGVjdC1tdWx0aXBsZSI9PT1kKSYmZmEuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuX2RhdGEoYSwiX2NoYW5nZV9kYXRhIixVYShhKSl9fSxzZXR1cDpmdW5jdGlvbihhLGIpe2lmKCJmaWxlIj09PQp0aGlzLnR5cGUpcmV0dXJuITE7Zm9yKHZhciBkIGluIFcpYy5ldmVudC5hZGQodGhpcyxkKyIuc3BlY2lhbENoYW5nZSIsV1tkXSk7cmV0dXJuIHJhLnRlc3QodGhpcy5ub2RlTmFtZSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsQ2hhbmdlIik7cmV0dXJuIHJhLnRlc3QodGhpcy5ub2RlTmFtZSl9fTtXPWMuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVycztXLmZvY3VzPVcuYmVmb3JlYWN0aXZhdGV9Yy5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxjLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZChhKXt2YXIgZD1jLmV2ZW50LmZpeChhKTtkLnR5cGU9YjtkLm9yaWdpbmFsRXZlbnQ9e307Yy5ldmVudC50cmlnZ2VyKGQsbnVsbCxkLnRhcmdldCk7ZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYS5wcmV2ZW50RGVmYXVsdCgpfXZhciBlPTA7Yy5ldmVudC5zcGVjaWFsW2JdPQp7c2V0dXA6ZnVuY3Rpb24oKXswPT09ZSsrJiZtLmFkZEV2ZW50TGlzdGVuZXIoYSxkLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXswPT09LS1lJiZtLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLCEwKX19fSk7Yy5lYWNoKFsiYmluZCIsIm9uZSJdLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihhLGUsZil7dmFyIGc7aWYoIm9iamVjdCI9PT10eXBlb2YgYSl7Zm9yKHZhciBoIGluIGEpdGhpc1tiXShoLGUsYVtoXSxmKTtyZXR1cm4gdGhpc31pZigyPT09YXJndW1lbnRzLmxlbmd0aHx8ITE9PT1lKWY9ZSxlPXZvaWQgMDsib25lIj09PWI/KGc9ZnVuY3Rpb24oYSl7Yyh0aGlzKS51bmJpbmQoYSxnKTtyZXR1cm4gZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGcuZ3VpZD1mLmd1aWR8fGMuZ3VpZCsrKTpnPWY7aWYoInVubG9hZCI9PT1hJiYib25lIiE9PWIpdGhpcy5vbmUoYSxlLGYpO2Vsc2V7aD0wO2Zvcih2YXIgaz10aGlzLmxlbmd0aDtoPGs7aCsrKWMuZXZlbnQuYWRkKHRoaXNbaF0sCmEsZyxlKX1yZXR1cm4gdGhpc319KTtjLmZuLmV4dGVuZCh7dW5iaW5kOmZ1bmN0aW9uKGEsYil7aWYoIm9iamVjdCIhPT10eXBlb2YgYXx8YS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspYy5ldmVudC5yZW1vdmUodGhpc1tkXSxhLGIpO2Vsc2UgZm9yKGQgaW4gYSl0aGlzLnVuYmluZChkLGFbZF0pO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxlKXtyZXR1cm4gdGhpcy5saXZlKGIsYyxlLGEpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy51bmJpbmQoImxpdmUiKTp0aGlzLmRpZShiLG51bGwsYyxhKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gYy5ldmVudC50cmlnZ2VyKGEsCmIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsZD1hLmd1aWR8fGMuZ3VpZCsrLGU9MCxmPWZ1bmN0aW9uKGQpe3ZhciBmPShjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZTtjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGYrMSk7ZC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2ZdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2ZvcihmLmd1aWQ9ZDtlPGIubGVuZ3RoOyliW2UrK10uZ3VpZD1kO3JldHVybiB0aGlzLmNsaWNrKGYpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KTt2YXIgc2E9e2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCIsbW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2MuZWFjaChbImxpdmUiLCJkaWUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oYSxlLGYsZyl7dmFyIGg9CjAsayxsLG49Z3x8dGhpcy5zZWxlY3RvcixwPWc/dGhpczpjKHRoaXMuY29udGV4dCk7aWYoIm9iamVjdCI9PT10eXBlb2YgYSYmIWEucHJldmVudERlZmF1bHQpe2ZvcihrIGluIGEpcFtiXShrLGUsYVtrXSxuKTtyZXR1cm4gdGhpc31pZigiZGllIj09PWImJiFhJiZnJiYiLiI9PT1nLmNoYXJBdCgwKSlyZXR1cm4gcC51bmJpbmQoZyksdGhpcztpZighMT09PWV8fGMuaXNGdW5jdGlvbihlKSlmPWV8fEUsZT12b2lkIDA7Zm9yKGE9KGF8fCIiKS5zcGxpdCgiICIpO251bGwhPShnPWFbaCsrXSk7KWlmKGs9aWEuZXhlYyhnKSxsPSIiLGsmJihsPWtbMF0sZz1nLnJlcGxhY2UoaWEsIiIpKSwiaG92ZXIiPT09ZylhLnB1c2goIm1vdXNlZW50ZXIiK2wsIm1vdXNlbGVhdmUiK2wpO2Vsc2UgaWYoaz1nLHNhW2ddPyhhLnB1c2goc2FbZ10rbCksZys9bCk6Zz0oc2FbZ118fGcpK2wsImxpdmUiPT09Yil7bD0wO2Zvcih2YXIgbT1wLmxlbmd0aDtsPG07bCsrKWMuZXZlbnQuYWRkKHBbbF0sImxpdmUuIisKWihnLG4pLHtkYXRhOmUsc2VsZWN0b3I6bixoYW5kbGVyOmYsb3JpZ1R5cGU6ZyxvcmlnSGFuZGxlcjpmLHByZVR5cGU6a30pfWVsc2UgcC51bmJpbmQoImxpdmUuIitaKGcsbiksZik7cmV0dXJuIHRoaXN9fSk7Yy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihhLGMpe251bGw9PWMmJihjPWEsYT1udWxsKTtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMuYmluZChiLGEsYyk6dGhpcy50cmlnZ2VyKGIpfTtjLmF0dHJGbiYmKGMuYXR0ckZuW2JdPSEwKX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiLApjLGQsZSxmKXtlPTA7Zm9yKHZhciBnPWQubGVuZ3RoO2U8ZztlKyspe3ZhciBoPWRbZV07aWYoaCl7Zm9yKHZhciBrPSExLGg9aFthXTtoOyl7aWYoaC5zaXpjYWNoZT09PWMpe2s9ZFtoLnNpenNldF07YnJlYWt9MSE9PWgubm9kZVR5cGV8fGZ8fChoLnNpemNhY2hlPWMsaC5zaXpzZXQ9ZSk7aWYoaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yil7az1oO2JyZWFrfWg9aFthXX1kW2VdPWt9fX1mdW5jdGlvbiBiKGEsYixjLGQsZSxmKXtlPTA7Zm9yKHZhciBnPWQubGVuZ3RoO2U8ZztlKyspe3ZhciBoPWRbZV07aWYoaCl7Zm9yKHZhciBrPSExLGg9aFthXTtoOyl7aWYoaC5zaXpjYWNoZT09PWMpe2s9ZFtoLnNpenNldF07YnJlYWt9aWYoMT09PWgubm9kZVR5cGUpaWYoZnx8KGguc2l6Y2FjaGU9YyxoLnNpenNldD1lKSwic3RyaW5nIiE9PXR5cGVvZiBiKXtpZihoPT09Yil7az0hMDticmVha319ZWxzZSBpZigwPG4uZmlsdGVyKGIsW2hdKS5sZW5ndGgpe2s9aDticmVha31oPWhbYV19ZFtlXT0Ka319fXZhciBkPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZT0wLGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxnPSExLGg9ITAsaz0vXFwvZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2g9ITE7cmV0dXJuIDB9KTt2YXIgbj1mdW5jdGlvbihhLGIsYyxlKXtjPWN8fFtdO3ZhciBnPWI9Ynx8bTtpZigxIT09Yi5ub2RlVHlwZSYmOSE9PWIubm9kZVR5cGUpcmV0dXJuW107aWYoIWF8fCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIGM7dmFyIGgsayxsLHgsdCxPPSEwLHk9bi5pc1hNTChiKSx1PVtdLHo9YTtkbyBpZihkLmV4ZWMoIiIpLGg9ZC5leGVjKHopKWlmKHo9aFszXSx1LnB1c2goaFsxXSksaFsyXSl7eD1oWzNdO2JyZWFrfXdoaWxlKGgpO2lmKDE8dS5sZW5ndGgmJnEuZXhlYyhhKSlpZigyPT09CnUubGVuZ3RoJiZwLnJlbGF0aXZlW3VbMF1dKWs9QSh1WzBdK3VbMV0sYik7ZWxzZSBmb3Ioaz1wLnJlbGF0aXZlW3VbMF1dP1tiXTpuKHUuc2hpZnQoKSxiKTt1Lmxlbmd0aDspYT11LnNoaWZ0KCkscC5yZWxhdGl2ZVthXSYmKGErPXUuc2hpZnQoKSksaz1BKGEsayk7ZWxzZSBpZighZSYmMTx1Lmxlbmd0aCYmOT09PWIubm9kZVR5cGUmJiF5JiZwLm1hdGNoLklELnRlc3QodVswXSkmJiFwLm1hdGNoLklELnRlc3QodVt1Lmxlbmd0aC0xXSkmJihoPW4uZmluZCh1LnNoaWZ0KCksYix5KSxiPWguZXhwcj9uLmZpbHRlcihoLmV4cHIsaC5zZXQpWzBdOmguc2V0WzBdKSxiKWZvcihoPWU/e2V4cHI6dS5wb3AoKSxzZXQ6dyhlKX06bi5maW5kKHUucG9wKCksMSE9PXUubGVuZ3RofHwifiIhPT11WzBdJiYiKyIhPT11WzBdfHwhYi5wYXJlbnROb2RlP2I6Yi5wYXJlbnROb2RlLHkpLGs9aC5leHByP24uZmlsdGVyKGguZXhwcixoLnNldCk6aC5zZXQsMDx1Lmxlbmd0aD9sPXcoayk6Tz0hMTt1Lmxlbmd0aDspaD0KdD11LnBvcCgpLHAucmVsYXRpdmVbdF0/aD11LnBvcCgpOnQ9IiIsbnVsbD09aCYmKGg9YikscC5yZWxhdGl2ZVt0XShsLGgseSk7ZWxzZSBsPVtdO2x8fChsPWspO2x8fG4uZXJyb3IodHx8YSk7aWYoIltvYmplY3QgQXJyYXldIj09PWYuY2FsbChsKSlpZihPKWlmKGImJjE9PT1iLm5vZGVUeXBlKWZvcihhPTA7bnVsbCE9bFthXTthKyspbFthXSYmKCEwPT09bFthXXx8MT09PWxbYV0ubm9kZVR5cGUmJm4uY29udGFpbnMoYixsW2FdKSkmJmMucHVzaChrW2FdKTtlbHNlIGZvcihhPTA7bnVsbCE9bFthXTthKyspbFthXSYmMT09PWxbYV0ubm9kZVR5cGUmJmMucHVzaChrW2FdKTtlbHNlIGMucHVzaC5hcHBseShjLGwpO2Vsc2UgdyhsLGMpO3gmJihuKHgsZyxjLGUpLG4udW5pcXVlU29ydChjKSk7cmV0dXJuIGN9O24udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih5JiYoZz1oLGEuc29ydCh5KSxnKSlmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sCjEpO3JldHVybiBhfTtuLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbihhLG51bGwsbnVsbCxiKX07bi5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDxuKGIsbnVsbCxudWxsLFthXSkubGVuZ3RofTtuLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFhKXJldHVybltdO2Zvcih2YXIgZT0wLGY9cC5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7dmFyIGcsaD1wLm9yZGVyW2VdO2lmKGc9cC5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7dmFyIGw9Z1sxXTtnLnNwbGljZSgxLDEpO2lmKCJcXCIhPT1sLnN1YnN0cihsLmxlbmd0aC0xKSYmKGdbMV09KGdbMV18fCIiKS5yZXBsYWNlKGssIiIpLGQ9cC5maW5kW2hdKGcsYixjKSxudWxsIT1kKSl7YT1hLnJlcGxhY2UocC5tYXRjaFtoXSwiIik7YnJlYWt9fX1kfHwoZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLApleHByOmF9fTtuLmZpbHRlcj1mdW5jdGlvbihhLGIsYyxkKXtmb3IodmFyIGUsZixnPWEsaD1bXSxrPWIsbD1iJiZiWzBdJiZuLmlzWE1MKGJbMF0pO2EmJmIubGVuZ3RoOyl7Zm9yKHZhciBtIGluIHAuZmlsdGVyKWlmKG51bGwhPShlPXAubGVmdE1hdGNoW21dLmV4ZWMoYSkpJiZlWzJdKXt2YXIgcSx1LHg9cC5maWx0ZXJbbV07dT1lWzFdO2Y9ITE7ZS5zcGxpY2UoMSwxKTtpZigiXFwiIT09dS5zdWJzdHIodS5sZW5ndGgtMSkpe2s9PT1oJiYoaD1bXSk7aWYocC5wcmVGaWx0ZXJbbV0paWYoZT1wLnByZUZpbHRlclttXShlLGssYyxoLGQsbCksIWUpZj1xPSEwO2Vsc2UgaWYoITA9PT1lKWNvbnRpbnVlO2lmKGUpZm9yKHZhciB0PTA7bnVsbCE9KHU9a1t0XSk7dCsrKWlmKHUpe3E9eCh1LGUsdCxrKTt2YXIgdz1kXiEhcTtjJiZudWxsIT1xP3c/Zj0hMDprW3RdPSExOncmJihoLnB1c2godSksZj0hMCl9aWYodm9pZCAwIT09cSl7Y3x8KGs9aCk7YT1hLnJlcGxhY2UocC5tYXRjaFttXSwKIiIpO2lmKCFmKXJldHVybltdO2JyZWFrfX19aWYoYT09PWcpaWYobnVsbD09ZiluLmVycm9yKGEpO2Vsc2UgYnJlYWs7Zz1hfXJldHVybiBrfTtuLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYTt9O3ZhciBwPW4uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LywKUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPSJzdHJpbmciPT09dHlwZW9mIGIsZD1jJiYhbC50ZXN0KGIpLGM9YyYmIWQ7ZCYmKGI9Yi50b0xvd2VyQ2FzZSgpKTtmb3IodmFyIGQ9MCxlPWEubGVuZ3RoLGY7ZDxlO2QrKylpZihmPWFbZF0pe2Zvcig7KGY9Zi5wcmV2aW91c1NpYmxpbmcpJiYxIT09Zi5ub2RlVHlwZTspOwphW2RdPWN8fGYmJmYubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/Znx8ITE6Zj09PWJ9YyYmbi5maWx0ZXIoYixhLCEwKX0sIlx4M2UiOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0ic3RyaW5nIj09PXR5cGVvZiBiLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpZm9yKGI9Yi50b0xvd2VyQ2FzZSgpO2U8ZjtlKyspe2lmKGM9YVtlXSljPWMucGFyZW50Tm9kZSxhW2VdPWMubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/YzohMX1lbHNle2Zvcig7ZTxmO2UrKykoYz1hW2VdKSYmKGFbZV09ZD9jLnBhcmVudE5vZGU6Yy5wYXJlbnROb2RlPT09Yik7ZCYmbi5maWx0ZXIoYixhLCEwKX19LCIiOmZ1bmN0aW9uKGMsZCxmKXt2YXIgZyxoPWUrKyxrPWI7InN0cmluZyIhPT10eXBlb2YgZHx8bC50ZXN0KGQpfHwoZz1kPWQudG9Mb3dlckNhc2UoKSxrPWEpO2soInBhcmVudE5vZGUiLGQsaCxjLGcsZil9LCJ+IjpmdW5jdGlvbihjLGQsZil7dmFyIGcsaD1lKyssaz1iOyJzdHJpbmciIT09CnR5cGVvZiBkfHxsLnRlc3QoZCl8fChnPWQ9ZC50b0xvd2VyQ2FzZSgpLGs9YSk7aygicHJldmlvdXNTaWJsaW5nIixkLGgsYyxnLGYpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oYSxiLGMpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJiFjKXJldHVybihhPWIuZ2V0RWxlbWVudEJ5SWQoYVsxXSkpJiZhLnBhcmVudE5vZGU/W2FdOltdfSxOQU1FOmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSl7dmFyIGM9W107Yj1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKyliW2RdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGJbZF0pO3JldHVybiAwPT09Yy5sZW5ndGg/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSlyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LApwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXthPSIgIithWzFdLnJlcGxhY2UoaywiIikrIiAiO2lmKGYpcmV0dXJuIGE7Zj0wO2Zvcih2YXIgZztudWxsIT0oZz1iW2ZdKTtmKyspZyYmKGVeKGcuY2xhc3NOYW1lJiYwPD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywiICIpLmluZGV4T2YoYSkpP2N8fGQucHVzaChnKTpjJiYoYltmXT0hMSkpO3JldHVybiExfSxJRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGssIiIpfSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGssIiIpLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGEpe2lmKCJudGgiPT09YVsxXSl7YVsyXXx8bi5lcnJvcihhWzBdKTthWzJdPWFbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCIiKTt2YXIgYj0vKC0/KShcZCopKD86bihbK1wtXT9cZCopKT8vLmV4ZWMoImV2ZW4iPT09YVsyXSYmIjJuInx8Im9kZCI9PT1hWzJdJiYiMm4rMSJ8fAohL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTA7YVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZuLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtiPWFbMV09YVsxXS5yZXBsYWNlKGssIiIpOyFmJiZwLmF0dHJNYXBbYl0mJihhWzFdPXAuYXR0ck1hcFtiXSk7YVs0XT0oYVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoaywiIik7In5ceDNkIj09PWFbMl0mJihhWzRdPSIgIithWzRdKyIgIik7cmV0dXJuIGF9LFBTRVVETzpmdW5jdGlvbihhLGIsYyxlLGYpe2lmKCJub3QiPT09YVsxXSlpZigxPChkLmV4ZWMoYVszXSl8fCIiKS5sZW5ndGh8fC9eXHcvLnRlc3QoYVszXSkpYVszXT1uKGFbM10sbnVsbCxudWxsLGIpO2Vsc2UgcmV0dXJuIGE9bi5maWx0ZXIoYVszXSxiLGMsMV5mKSxjfHxlLnB1c2guYXBwbHkoZSxhKSwhMTtlbHNlIGlmKHAubWF0Y2guUE9TLnRlc3QoYVswXSl8fHAubWF0Y2guQ0hJTEQudGVzdChhWzBdKSlyZXR1cm4hMDsKcmV0dXJuIGF9LFBPUzpmdW5jdGlvbihhKXthLnVuc2hpZnQoITApO3JldHVybiBhfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4hMT09PWEuZGlzYWJsZWQmJiJoaWRkZW4iIT09YS50eXBlfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4hMD09PWEuZGlzYWJsZWR9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1hLmNoZWNrZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuITA9PT1hLnNlbGVjdGVkfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFuKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSwKYz1hLnR5cGU7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YyYmKGI9PT1jfHxudWxsPT09Yil9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJjaGVja2JveCI9PT1hLnR5cGV9LGZpbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Ynx8ImJ1dHRvbiI9PT1iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LAppbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ifHwiYnV0dG9uIj09PWIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoYS5ub2RlTmFtZSl9LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09YS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9fSxzZXRGaWx0ZXJzOntmaXJzdDpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yn0sbGFzdDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYj09PWQubGVuZ3RoLQoxfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDA9PT1iJTJ9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiAxPT09YiUyfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9cC5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoImNvbnRhaW5zIj09PWUpcmV0dXJuIDA8PShhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bi5nZXRUZXh0KFthXSl8fCIiKS5pbmRleE9mKGJbM10pO2lmKCJub3QiPT09ZSl7Yj1iWzNdO2M9MDtmb3IoZD1iLmxlbmd0aDtjPGQ7YysrKWlmKGJbY109PT1hKXJldHVybiExO3JldHVybiEwfW4uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsCmIpe3ZhciBjPWJbMV0sZD1hO3N3aXRjaChjKXtjYXNlICJvbmx5IjpjYXNlICJmaXJzdCI6Zm9yKDtkPWQucHJldmlvdXNTaWJsaW5nOylpZigxPT09ZC5ub2RlVHlwZSlyZXR1cm4hMTtpZigiZmlyc3QiPT09YylyZXR1cm4hMDtkPWE7Y2FzZSAibGFzdCI6Zm9yKDtkPWQubmV4dFNpYmxpbmc7KWlmKDE9PT1kLm5vZGVUeXBlKXJldHVybiExO3JldHVybiEwO2Nhc2UgIm50aCI6dmFyIGM9YlsyXSxlPWJbM107aWYoMT09PWMmJjA9PT1lKXJldHVybiEwO2I9YlswXTt2YXIgZj1hLnBhcmVudE5vZGU7aWYoZiYmKGYuc2l6Y2FjaGUhPT1ifHwhYS5ub2RlSW5kZXgpKXtmb3IodmFyIGc9MCxkPWYuZmlyc3RDaGlsZDtkO2Q9ZC5uZXh0U2libGluZykxPT09ZC5ub2RlVHlwZSYmKGQubm9kZUluZGV4PSsrZyk7Zi5zaXpjYWNoZT1ifWE9YS5ub2RlSW5kZXgtZTtyZXR1cm4gMD09PWM/MD09PWE6MD09PWElYyYmMDw9YS9jfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMT09PWEubm9kZVR5cGUmJgphLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiIqIj09PWImJjE9PT1hLm5vZGVUeXBlfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifSxDTEFTUzpmdW5jdGlvbihhLGIpe3JldHVybi0xPCgiICIrKGEuY2xhc3NOYW1lfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKGIpfSxBVFRSOmZ1bmN0aW9uKGEsYil7dmFyIGM9YlsxXTthPXAuYXR0ckhhbmRsZVtjXT9wLmF0dHJIYW5kbGVbY10oYSk6bnVsbCE9YVtjXT9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpO3ZhciBjPWErIiIsZD1iWzJdO2I9Yls0XTtyZXR1cm4gbnVsbD09YT8iIVx4M2QiPT09ZDoiXHgzZCI9PT1kP2M9PT1iOiIqXHgzZCI9PT1kPzA8PWMuaW5kZXhPZihiKToiflx4M2QiPT09ZD8wPD0oIiAiK2MrIiAiKS5pbmRleE9mKGIpOmI/IiFceDNkIj09PWQ/YyE9PWI6Il5ceDNkIj09PWQ/MD09PWMuaW5kZXhPZihiKToiJFx4M2QiPT09ZD9jLnN1YnN0cihjLmxlbmd0aC0KYi5sZW5ndGgpPT09YjoifFx4M2QiPT09ZD9jPT09Ynx8Yy5zdWJzdHIoMCxiLmxlbmd0aCsxKT09PWIrIi0iOiExOmMmJiExIT09YX0sUE9TOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXAuc2V0RmlsdGVyc1tiWzJdXTtpZihlKXJldHVybiBlKGEsYyxiLGQpfX19LHE9cC5tYXRjaC5QT1MseD1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX0sdDtmb3IodCBpbiBwLm1hdGNoKXAubWF0Y2hbdF09bmV3IFJlZ0V4cChwLm1hdGNoW3RdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpLHAubGVmdE1hdGNoW3RdPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStwLm1hdGNoW3RdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2cseCkpO3ZhciB3PWZ1bmN0aW9uKGEsYil7YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLDApO3JldHVybiBiPyhiLnB1c2guYXBwbHkoYixhKSxiKTphfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywKMClbMF0ubm9kZVR5cGV9Y2F0Y2godil7dz1mdW5jdGlvbihhLGIpe3ZhciBjPTA7Yj1ifHxbXTtpZigiW29iamVjdCBBcnJheV0iPT09Zi5jYWxsKGEpKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGIsYSk7ZWxzZSBpZigibnVtYmVyIj09PXR5cGVvZiBhLmxlbmd0aClmb3IodmFyIGQ9YS5sZW5ndGg7YzxkO2MrKyliLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWIucHVzaChhW2NdKTtyZXR1cm4gYn19dmFyIHksejttLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj95PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iPyhnPSEwLDApOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjE6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfTooeT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBnPSEwLDA7aWYoYS5zb3VyY2VJbmRleCYmCmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXTtjPWEucGFyZW50Tm9kZTtkPWIucGFyZW50Tm9kZTt2YXIgaD1jO2lmKGM9PT1kKXJldHVybiB6KGEsYik7aWYoIWMpcmV0dXJuLTE7aWYoIWQpcmV0dXJuIDE7Zm9yKDtoOyllLnVuc2hpZnQoaCksaD1oLnBhcmVudE5vZGU7Zm9yKGg9ZDtoOylmLnVuc2hpZnQoaCksaD1oLnBhcmVudE5vZGU7Yz1lLmxlbmd0aDtkPWYubGVuZ3RoO2ZvcihoPTA7aDxjJiZoPGQ7aCsrKWlmKGVbaF0hPT1mW2hdKXJldHVybiB6KGVbaF0sZltoXSk7cmV0dXJuIGg9PT1jP3ooYSxmW2hdLC0xKTp6KGVbaF0sYiwxKX0sej1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7Zm9yKGE9YS5uZXh0U2libGluZzthOyl7aWYoYT09PWIpcmV0dXJuLTE7YT1hLm5leHRTaWJsaW5nfXJldHVybiAxfSk7bi5nZXRUZXh0PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGQ9MDthW2RdO2QrKyljPQphW2RdLDM9PT1jLm5vZGVUeXBlfHw0PT09Yy5ub2RlVHlwZT9iKz1jLm5vZGVWYWx1ZTo4IT09Yy5ub2RlVHlwZSYmKGIrPW4uZ2V0VGV4dChjLmNoaWxkTm9kZXMpKTtyZXR1cm4gYn07KGZ1bmN0aW9uKCl7dmFyIGE9bS5jcmVhdGVFbGVtZW50KCJkaXYiKSxiPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpLGM9bS5kb2N1bWVudEVsZW1lbnQ7YS5pbm5lckhUTUw9Ilx4M2NhIG5hbWVceDNkJyIrYisiJy9ceDNlIjtjLmluc2VydEJlZm9yZShhLGMuZmlyc3RDaGlsZCk7bS5nZXRFbGVtZW50QnlJZChiKSYmKHAuZmluZC5JRD1mdW5jdGlvbihhLGIsYyl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmIWMpcmV0dXJuKGI9Yi5nZXRFbGVtZW50QnlJZChhWzFdKSk/Yi5pZD09PWFbMV18fCJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2V0QXR0cmlidXRlTm9kZSYmYi5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2JdOnZvaWQgMDoKW119LHAuZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9InVuZGVmaW5lZCIhPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIDE9PT1hLm5vZGVUeXBlJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KTtjLnJlbW92ZUNoaWxkKGEpO2M9YT1udWxsfSkoKTsoZnVuY3Rpb24oKXt2YXIgYT1tLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQobS5jcmVhdGVDb21tZW50KCIiKSk7MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoJiYocC5maW5kLlRBRz1mdW5jdGlvbihhLGIpe2I9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKTtpZigiKiI9PT1hWzFdKXthPVtdO2Zvcih2YXIgYz0wO2JbY107YysrKTE9PT1iW2NdLm5vZGVUeXBlJiZhLnB1c2goYltjXSk7Yj1hfXJldHVybiBifSk7YS5pbm5lckhUTUw9Ilx4M2NhIGhyZWZceDNkJyMnXHgzZVx4M2MvYVx4M2UiO2EuZmlyc3RDaGlsZCYmInVuZGVmaW5lZCIhPT0KdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUmJiIjIiE9PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSYmKHAuYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KTthPW51bGx9KSgpO20ucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1uLGI9bS5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD0iXHgzY3AgY2xhc3NceDNkJ1RFU1QnXHgzZVx4M2MvcFx4M2UiO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fDAhPT1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoKXtuPWZ1bmN0aW9uKGIsYyxkLGUpe2M9Y3x8bTtpZighZSYmIW4uaXNYTUwoYykpe3ZhciBmPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGYmJigxPT09Yy5ub2RlVHlwZXx8OT09PWMubm9kZVR5cGUpKXtpZihmWzFdKXJldHVybiB3KGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksCmQpO2lmKGZbMl0mJnAuZmluZC5DTEFTUyYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiB3KGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmWzJdKSxkKX1pZig5PT09Yy5ub2RlVHlwZSl7aWYoImJvZHkiPT09YiYmYy5ib2R5KXJldHVybiB3KFtjLmJvZHldLGQpO2lmKGYmJmZbM10pe3ZhciBnPWMuZ2V0RWxlbWVudEJ5SWQoZlszXSk7aWYoZyYmZy5wYXJlbnROb2RlKXtpZihnLmlkPT09ZlszXSlyZXR1cm4gdyhbZ10sZCl9ZWxzZSByZXR1cm4gdyhbXSxkKX10cnl7cmV0dXJuIHcoYy5xdWVyeVNlbGVjdG9yQWxsKGIpLGQpfWNhdGNoKGgpe319ZWxzZSBpZigxPT09Yy5ub2RlVHlwZSYmIm9iamVjdCIhPT1jLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBmPWMsaz0oZz1jLmdldEF0dHJpYnV0ZSgiaWQiKSl8fCJfX3NpenpsZV9fIixsPWMucGFyZW50Tm9kZSxyPS9eXHMqWyt+XS8udGVzdChiKTtnP2s9ay5yZXBsYWNlKC8nL2csIlxcJFx4MjYiKTpjLnNldEF0dHJpYnV0ZSgiaWQiLAprKTtyJiZsJiYoYz1jLnBhcmVudE5vZGUpO3RyeXtpZighcnx8bClyZXR1cm4gdyhjLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZFx4M2QnIitrKyInXSAiK2IpLGQpfWNhdGNoKGgpe31maW5hbGx5e2d8fGYucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixjLGQsZSl9O2Zvcih2YXIgYyBpbiBhKW5bY109YVtjXTtiPW51bGx9fSgpOyhmdW5jdGlvbigpe3ZhciBhPW0uZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgYz0hYi5jYWxsKG0uY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGQ9ITE7dHJ5e2IuY2FsbChtLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhXHgzZCcnXTpzaXp6bGUiKX1jYXRjaChlKXtkPSEwfW4ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsZSl7ZT1lLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csCiJceDNkJyQxJ10iKTtpZighbi5pc1hNTChhKSl0cnl7aWYoZHx8IXAubWF0Y2guUFNFVURPLnRlc3QoZSkmJiEvIT0vLnRlc3QoZSkpe3ZhciBmPWIuY2FsbChhLGUpO2lmKGZ8fCFjfHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGZ9fWNhdGNoKGcpe31yZXR1cm4gMDxuKGUsbnVsbCxudWxsLFthXSkubGVuZ3RofX19KSgpOyhmdW5jdGlvbigpe3ZhciBhPW0uY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9Ilx4M2NkaXYgY2xhc3NceDNkJ3Rlc3QgZSdceDNlXHgzYy9kaXZceDNlXHgzY2RpdiBjbGFzc1x4M2QndGVzdCdceDNlXHgzYy9kaXZceDNlIjthLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJjAhPT1hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGgmJihhLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiLDEhPT1hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGgmJihwLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksCnAuZmluZC5DTEFTUz1mdW5jdGlvbihhLGIsYyl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGwpKX0pKCk7bi5jb250YWlucz1tLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9mdW5jdGlvbihhLGIpe3JldHVybiBhIT09YiYmKGEuY29udGFpbnM/YS5jb250YWlucyhiKTohMCl9Om0uZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9OmZ1bmN0aW9uKCl7cmV0dXJuITF9O24uaXNYTUw9ZnVuY3Rpb24oYSl7cmV0dXJuKGE9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudCk/IkhUTUwiIT09YS5ub2RlTmFtZTohMX07dmFyIEE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9IiI7Zm9yKGI9Yi5ub2RlVHlwZT9bYl06CmI7Yz1wLm1hdGNoLlBTRVVETy5leGVjKGEpOyllKz1jWzBdLGE9YS5yZXBsYWNlKHAubWF0Y2guUFNFVURPLCIiKTthPXAucmVsYXRpdmVbYV0/YSsiKiI6YTtjPTA7Zm9yKHZhciBmPWIubGVuZ3RoO2M8ZjtjKyspbihhLGJbY10sZCk7cmV0dXJuIG4uZmlsdGVyKGUsZCl9O2MuZmluZD1uO2MuZXhwcj1uLnNlbGVjdG9ycztjLmV4cHJbIjoiXT1jLmV4cHIuZmlsdGVycztjLnVuaXF1ZT1uLnVuaXF1ZVNvcnQ7Yy50ZXh0PW4uZ2V0VGV4dDtjLmlzWE1MRG9jPW4uaXNYTUw7Yy5jb250YWlucz1uLmNvbnRhaW5zfSkoKTt2YXIgRWI9L1VudGlsJC8sRmI9L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sR2I9LywvLG5iPS9eLlteOiNcW1wuLF0qJC8sSGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLFZhPWMuZXhwci5tYXRjaC5QT1MsSWI9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07Yy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcywKZCxlO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIGMoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7ZD0wO2ZvcihlPWIubGVuZ3RoO2Q8ZTtkKyspaWYoYy5jb250YWlucyhiW2RdLHRoaXMpKXJldHVybiEwfSk7dmFyIGY9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxrO2Q9MDtmb3IoZT10aGlzLmxlbmd0aDtkPGU7ZCsrKWlmKGc9Zi5sZW5ndGgsYy5maW5kKGEsdGhpc1tkXSxmKSwwPGQpZm9yKGg9ZztoPGYubGVuZ3RoO2grKylmb3Ioaz0wO2s8ZztrKyspaWYoZltrXT09PWZbaF0pe2Yuc3BsaWNlKGgtLSwxKTticmVha31yZXR1cm4gZn0saGFzOmZ1bmN0aW9uKGEpe3ZhciBiPWMoYSk7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsZT1iLmxlbmd0aDthPGU7YSsrKWlmKGMuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHphKHRoaXMsYSwhMSksIm5vdCIsYSl9LApmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHphKHRoaXMsYSwhMCksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmKCJzdHJpbmciPT09dHlwZW9mIGE/MDxjLmZpbHRlcihhLHRoaXMpLmxlbmd0aDowPHRoaXMuZmlsdGVyKGEpLmxlbmd0aCl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD1bXSxlLGYsZz10aGlzWzBdO2lmKGMuaXNBcnJheShhKSl7dmFyIGgsaz17fSxsPTE7aWYoZyYmYS5sZW5ndGgpe2U9MDtmb3IoZj1hLmxlbmd0aDtlPGY7ZSsrKWg9YVtlXSxrW2hdfHwoa1toXT1WYS50ZXN0KGgpP2MoaCxifHx0aGlzLmNvbnRleHQpOmgpO2Zvcig7ZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yjspe2ZvcihoIGluIGspYT1rW2hdLChhLmpxdWVyeT8tMTxhLmluZGV4KGcpOmMoZykuaXMoYSkpJiZkLnB1c2goe3NlbGVjdG9yOmgsZWxlbTpnLGxldmVsOmx9KTtnPWcucGFyZW50Tm9kZTtsKyt9fXJldHVybiBkfWg9VmEudGVzdChhKXx8CiJzdHJpbmciIT09dHlwZW9mIGE/YyhhLGJ8fHRoaXMuY29udGV4dCk6MDtlPTA7Zm9yKGY9dGhpcy5sZW5ndGg7ZTxmO2UrKylmb3IoZz10aGlzW2VdO2c7KWlmKGg/LTE8aC5pbmRleChnKTpjLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2QucHVzaChnKTticmVha31lbHNlIGlmKGc9Zy5wYXJlbnROb2RlLCFnfHwhZy5vd25lckRvY3VtZW50fHxnPT09Ynx8MTE9PT1nLm5vZGVUeXBlKWJyZWFrO2Q9MTxkLmxlbmd0aD9jLnVuaXF1ZShkKTpkO3JldHVybiB0aGlzLnB1c2hTdGFjayhkLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PT10eXBlb2YgYT9jLmluQXJyYXkodGhpc1swXSxjKGEpKTpjLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe2E9InN0cmluZyI9PT10eXBlb2YgYT9jKGEsYik6Yy5tYWtlQXJyYXkoYSYmCmEubm9kZVR5cGU/W2FdOmEpO2I9Yy5tZXJnZSh0aGlzLmdldCgpLGEpO3JldHVybiB0aGlzLnB1c2hTdGFjayh5YShhWzBdKXx8eWEoYlswXSk/YjpjLnVuaXF1ZShiKSl9LGFuZFNlbGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5wcmV2T2JqZWN0KX19KTtjLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4oYT1hLnBhcmVudE5vZGUpJiYxMSE9PWEubm9kZVR5cGU/YTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsInBhcmVudE5vZGUiLGQpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGMubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGlyKGEsCiJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciLGQpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGQpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Yy5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Yy5mblthXT1mdW5jdGlvbihkLGUpe3ZhciBmPWMubWFwKHRoaXMsYixkKSxnPUhiLmNhbGwoYXJndW1lbnRzKTtFYi50ZXN0KGEpfHwoZT1kKTtlJiYic3RyaW5nIj09PXR5cGVvZiBlJiYKKGY9Yy5maWx0ZXIoZSxmKSk7Zj0xPHRoaXMubGVuZ3RoJiYhSWJbYV0/Yy51bmlxdWUoZik6ZjsoMTx0aGlzLmxlbmd0aHx8R2IudGVzdChlKSkmJkZiLnRlc3QoYSkmJihmPWYucmV2ZXJzZSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGcuam9pbigiLCIpKX19KTtjLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixkKXtkJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gMT09PWIubGVuZ3RoP2MuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Yy5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1bXTtmb3IoYT1hW2JdO2EmJjkhPT1hLm5vZGVUeXBlJiYodm9pZCAwPT09ZHx8MSE9PWEubm9kZVR5cGV8fCFjKGEpLmlzKGQpKTspMT09PWEubm9kZVR5cGUmJmUucHVzaChhKSxhPWFbYl07cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsYyxlKXtiPWJ8fDE7Zm9yKGU9MDthJiYoMSE9PWEubm9kZVR5cGV8fCsrZSE9PWIpO2E9CmFbY10pO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBKYj0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLHRhPS9eXHMrLyxXYT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFhhPS88KFtcdzpdKykvLEtiPS88dGJvZHkvaSxMYj0vPHwmIz9cdys7LyxZYT0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLFphPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLE1iPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2kscWI9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8seT17b3B0aW9uOlsxLCJceDNjc2VsZWN0IG11bHRpcGxlXHgzZCdtdWx0aXBsZSdceDNlIiwiXHgzYy9zZWxlY3RceDNlIl0sbGVnZW5kOlsxLAoiXHgzY2ZpZWxkc2V0XHgzZSIsIlx4M2MvZmllbGRzZXRceDNlIl0sdGhlYWQ6WzEsIlx4M2N0YWJsZVx4M2UiLCJceDNjL3RhYmxlXHgzZSJdLHRyOlsyLCJceDNjdGFibGVceDNlXHgzY3Rib2R5XHgzZSIsIlx4M2MvdGJvZHlceDNlXHgzYy90YWJsZVx4M2UiXSx0ZDpbMywiXHgzY3RhYmxlXHgzZVx4M2N0Ym9keVx4M2VceDNjdHJceDNlIiwiXHgzYy90clx4M2VceDNjL3Rib2R5XHgzZVx4M2MvdGFibGVceDNlIl0sY29sOlsyLCJceDNjdGFibGVceDNlXHgzY3Rib2R5XHgzZVx4M2MvdGJvZHlceDNlXHgzY2NvbGdyb3VwXHgzZSIsIlx4M2MvY29sZ3JvdXBceDNlXHgzYy90YWJsZVx4M2UiXSxhcmVhOlsxLCJceDNjbWFwXHgzZSIsIlx4M2MvbWFwXHgzZSJdLF9kZWZhdWx0OlswLCIiLCIiXX07eS5vcHRncm91cD15Lm9wdGlvbjt5LnRib2R5PXkudGZvb3Q9eS5jb2xncm91cD15LmNhcHRpb249eS50aGVhZDt5LnRoPXkudGQ7Yy5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fCh5Ll9kZWZhdWx0PQpbMSwiZGl2XHgzY2Rpdlx4M2UiLCJceDNjL2Rpdlx4M2UiXSk7Yy5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKTtkLnRleHQoYS5jYWxsKHRoaXMsYixkLnRleHQoKSkpfSk6Im9iamVjdCIhPT10eXBlb2YgYSYmdm9pZCAwIT09YT90aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fG0pLmNyZWF0ZVRleHROb2RlKGEpKTpjLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Yyh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWMoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pO2IubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzO2EuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZTspYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gYy5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1jKHRoaXMpLGQ9Yi5jb250ZW50cygpO2QubGVuZ3RoP2Qud3JhcEFsbChhKTpiLmFwcGVuZChhKX0pfSx3cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjKHRoaXMpLndyYXBBbGwoYSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Mubm9kZU5hbWUodGhpcywiYm9keSIpfHxjKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLAohMCxmdW5jdGlvbihhKXsxPT09dGhpcy5ub2RlVHlwZSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpezE9PT10aGlzLm5vZGVUeXBlJiZ0aGlzLmluc2VydEJlZm9yZShhLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT1jKGFyZ3VtZW50c1swXSk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsCiExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGMoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTAsZTtudWxsIT0oZT10aGlzW2RdKTtkKyspaWYoIWF8fGMuZmlsdGVyKGEsW2VdKS5sZW5ndGgpYnx8MSE9PWUubm9kZVR5cGV8fChjLmNsZWFuRGF0YShlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGMuY2xlYW5EYXRhKFtlXSkpLGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7bnVsbCE9KGI9dGhpc1thXSk7YSsrKWZvcigxPT09Yi5ub2RlVHlwZSYmYy5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1udWxsPT1hPyExOmE7Yj1udWxsPT1iP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYy5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hKXJldHVybiB0aGlzWzBdJiYxPT09dGhpc1swXS5ub2RlVHlwZT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKEpiLCIiKTpudWxsO2lmKCJzdHJpbmciIT09dHlwZW9mIGF8fFlhLnRlc3QoYSl8fCFjLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJnRhLnRlc3QoYSl8fHlbKFhhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKWMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKTtkLmh0bWwoYS5jYWxsKHRoaXMsYixkLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtlbHNle2E9YS5yZXBsYWNlKFdhLCJceDNjJDFceDNlXHgzYy8kMlx4M2UiKTt0cnl7Zm9yKHZhciBiPQowLGQ9dGhpcy5sZW5ndGg7YjxkO2IrKykxPT09dGhpc1tiXS5ub2RlVHlwZSYmKGMuY2xlYW5EYXRhKHRoaXNbYl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tiXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKSxlPWQuaHRtbCgpO2QucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixlKSl9KTsic3RyaW5nIiE9PXR5cGVvZiBhJiYoYT1jKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxkPXRoaXMucGFyZW50Tm9kZTtjKHRoaXMpLnJlbW92ZSgpO2I/YyhiKS5iZWZvcmUoYSk6YyhkKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/CnRoaXMucHVzaFN0YWNrKGMoYy5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGcsaD1hWzBdLGs9W107aWYoIWMuc3VwcG9ydC5jaGVja0Nsb25lJiYzPT09YXJndW1lbnRzLmxlbmd0aCYmInN0cmluZyI9PT10eXBlb2YgaCYmWmEudGVzdChoKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5kb21NYW5pcChhLGIsZCwhMCl9KTtpZihjLmlzRnVuY3Rpb24oaCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1jKHRoaXMpO2FbMF09aC5jYWxsKHRoaXMsZSxiP2YuaHRtbCgpOnZvaWQgMCk7Zi5kb21NYW5pcChhLGIsZCl9KTtpZih0aGlzWzBdKXtlPWgmJmgucGFyZW50Tm9kZTtlPWMuc3VwcG9ydC5wYXJlbnROb2RlJiZlJiYxMT09PWUubm9kZVR5cGUmJmUuY2hpbGROb2Rlcy5sZW5ndGg9PT0KdGhpcy5sZW5ndGg/e2ZyYWdtZW50OmV9OmMuYnVpbGRGcmFnbWVudChhLHRoaXMsayk7Zz1lLmZyYWdtZW50O2lmKGY9MT09PWcuY2hpbGROb2Rlcy5sZW5ndGg/Zz1nLmZpcnN0Q2hpbGQ6Zy5maXJzdENoaWxkKXtiPWImJmMubm9kZU5hbWUoZiwidHIiKTtmb3IodmFyIGw9MCxuPXRoaXMubGVuZ3RoLG09bi0xO2w8bjtsKyspZC5jYWxsKGI/b2IodGhpc1tsXSxmKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHwxPG4mJmw8bT9jLmNsb25lKGcsITAsITApOmcpfWsubGVuZ3RoJiZjLmVhY2goayxwYil9cmV0dXJuIHRoaXN9fSk7Yy5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGcsaDtiJiZiWzBdJiYoaD1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pO2guY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGg9bSk7MT09PWEubGVuZ3RoJiYic3RyaW5nIj09PXR5cGVvZiBhWzBdJiY1MTI+YVswXS5sZW5ndGgmJmg9PT1tJiYiXHgzYyI9PT1hWzBdLmNoYXJBdCgwKSYmIVlhLnRlc3QoYVswXSkmJgooYy5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFaYS50ZXN0KGFbMF0pKSYmKGY9ITAsKGc9Yy5mcmFnbWVudHNbYVswXV0pJiYxIT09ZyYmKGU9ZykpO2V8fChlPWguY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGMuY2xlYW4oYSxoLGUsZCkpO2YmJihjLmZyYWdtZW50c1thWzBdXT1nP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmZ9fTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCl7dmFyIGU9W107ZD1jKGQpO3ZhciBmPTE9PT10aGlzLmxlbmd0aCYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGYmJjExPT09Zi5ub2RlVHlwZSYmMT09PWYuY2hpbGROb2Rlcy5sZW5ndGgmJjE9PT1kLmxlbmd0aClyZXR1cm4gZFtiXSh0aGlzWzBdKSx0aGlzOwpmb3IodmFyIGY9MCxnPWQubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPSgwPGY/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCk7YyhkW2ZdKVtiXShoKTtlPWUuY29uY2F0KGgpfXJldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsZC5zZWxlY3Rvcil9fSk7Yy5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1hLmNsb25lTm9kZSghMCksZixnLGg7aWYoIShjLnN1cHBvcnQubm9DbG9uZUV2ZW50JiZjLnN1cHBvcnQubm9DbG9uZUNoZWNrZWR8fDEhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGV8fGMuaXNYTUxEb2MoYSkpKWZvcihCYShhLGUpLGY9YWEoYSksZz1hYShlKSxoPTA7ZltoXTsrK2gpZ1toXSYmQmEoZltoXSxnW2hdKTtpZihiJiYoQWEoYSxlKSxkKSlmb3IoZj1hYShhKSxnPWFhKGUpLGg9MDtmW2hdOysraClBYShmW2hdLGdbaF0pO3JldHVybiBlfSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXtiPWJ8fG07InVuZGVmaW5lZCI9PT10eXBlb2YgYi5jcmVhdGVFbGVtZW50JiYKKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fG0pO2Zvcih2YXIgZj1bXSxnLGg9MCxrO251bGwhPShrPWFbaF0pO2grKylpZigibnVtYmVyIj09PXR5cGVvZiBrJiYoays9IiIpLGspe2lmKCJzdHJpbmciPT09dHlwZW9mIGspaWYoTGIudGVzdChrKSl7az1rLnJlcGxhY2UoV2EsIlx4M2MkMVx4M2VceDNjLyQyXHgzZSIpO2c9KFhhLmV4ZWMoayl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCk7dmFyIGw9eVtnXXx8eS5fZGVmYXVsdCxuPWxbMF0scD1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ZvcihwLmlubmVySFRNTD1sWzFdK2srbFsyXTtuLS07KXA9cC5sYXN0Q2hpbGQ7aWYoIWMuc3VwcG9ydC50Ym9keSlmb3Iobj1LYi50ZXN0KGspLGw9InRhYmxlIiE9PWd8fG4/Ilx4M2N0YWJsZVx4M2UiIT09bFsxXXx8bj9bXTpwLmNoaWxkTm9kZXM6cC5maXJzdENoaWxkJiZwLmZpcnN0Q2hpbGQuY2hpbGROb2RlcyxnPWwubGVuZ3RoLTE7MDw9ZzstLWcpYy5ub2RlTmFtZShsW2ddLAoidGJvZHkiKSYmIWxbZ10uY2hpbGROb2Rlcy5sZW5ndGgmJmxbZ10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsW2ddKTshYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZ0YS50ZXN0KGspJiZwLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKHRhLmV4ZWMoaylbMF0pLHAuZmlyc3RDaGlsZCk7az1wLmNoaWxkTm9kZXN9ZWxzZSBrPWIuY3JlYXRlVGV4dE5vZGUoayk7dmFyIHE7aWYoIWMuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWlmKGtbMF0mJiJudW1iZXIiPT09dHlwZW9mKHE9ay5sZW5ndGgpKWZvcihnPTA7ZzxxO2crKylEYShrW2ddKTtlbHNlIERhKGspO2subm9kZVR5cGU/Zi5wdXNoKGspOmY9Yy5tZXJnZShmLGspfWlmKGQpZm9yKGE9ZnVuY3Rpb24oYSl7cmV0dXJuIWEudHlwZXx8TWIudGVzdChhLnR5cGUpfSxoPTA7ZltoXTtoKyspIWV8fCFjLm5vZGVOYW1lKGZbaF0sInNjcmlwdCIpfHxmW2hdLnR5cGUmJiJ0ZXh0L2phdmFzY3JpcHQiIT09ZltoXS50eXBlLnRvTG93ZXJDYXNlKCk/CigxPT09ZltoXS5ub2RlVHlwZSYmKGI9Yy5ncmVwKGZbaF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGEpLGYuc3BsaWNlLmFwcGx5KGYsW2grMSwwXS5jb25jYXQoYikpKSxkLmFwcGVuZENoaWxkKGZbaF0pKTplLnB1c2goZltoXS5wYXJlbnROb2RlP2ZbaF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmW2hdKTpmW2hdKTtyZXR1cm4gZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixkLGU9Yy5jYWNoZSxmPWMuZXhwYW5kbyxnPWMuZXZlbnQuc3BlY2lhbCxoPWMuc3VwcG9ydC5kZWxldGVFeHBhbmRvLGs9MCxsO251bGwhPShsPWFba10pO2srKylpZighbC5ub2RlTmFtZXx8IWMubm9EYXRhW2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0paWYoZD1sW2MuZXhwYW5kb10pe2lmKChiPWVbZF0mJmVbZF1bZl0pJiZiLmV2ZW50cyl7Zm9yKHZhciBuIGluIGIuZXZlbnRzKWdbbl0/Yy5ldmVudC5yZW1vdmUobCxuKTpjLnJlbW92ZUV2ZW50KGwsbixiLmhhbmRsZSk7CmIuaGFuZGxlJiYoYi5oYW5kbGUuZWxlbT1udWxsKX1oP2RlbGV0ZSBsW2MuZXhwYW5kb106bC5yZW1vdmVBdHRyaWJ1dGUmJmwucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZGVsZXRlIGVbZF19fX0pO3ZhciB1YT0vYWxwaGFcKFteKV0qXCkvaSxOYj0vb3BhY2l0eT0oW14pXSopLyxPYj0vKFtBLVpdfF5tcykvZywkYT0vXi0/XGQrKD86cHgpPyQvaSxQYj0vXi0/XGQvLFFiPS9eKFtcLStdKT0oW1wtKy5cZGVdKykvLFJiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxyYj1bIkxlZnQiLCJSaWdodCJdLHNiPVsiVG9wIiwiQm90dG9tIl0sRixhYixiYjtjLmZuLmNzcz1mdW5jdGlvbihhLGIpe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwPT09Yj90aGlzOmMuYWNjZXNzKHRoaXMsYSxiLCEwLGZ1bmN0aW9uKGEsYixmKXtyZXR1cm4gdm9pZCAwIT09Zj9jLnN0eWxlKGEsYixmKTpjLmNzcyhhLGIpfSl9OwpjLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBiPyhhPUYoYSwib3BhY2l0eSIsIm9wYWNpdHkiKSwiIj09PWE/IjEiOmEpOmEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e2ZpbGxPcGFjaXR5OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjpjLnN1cHBvcnQuY3NzRmxvYXQ/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixkLGUpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGYsZz1jLmNhbWVsQ2FzZShiKSxoPWEuc3R5bGUsaz1jLmNzc0hvb2tzW2ddO2I9Yy5jc3NQcm9wc1tnXXx8ZztpZih2b2lkIDAhPT1kKXtpZihlPXR5cGVvZiBkLCJzdHJpbmciPT09ZSYmKGY9UWIuZXhlYyhkKSkmJihkPSsoZlsxXSsxKSorZlsyXSsKcGFyc2VGbG9hdChjLmNzcyhhLGIpKSxlPSJudW1iZXIiKSwhKG51bGw9PWR8fCJudW1iZXIiPT09ZSYmaXNOYU4oZCl8fCgibnVtYmVyIiE9PWV8fGMuY3NzTnVtYmVyW2ddfHwoZCs9InB4IiksayYmInNldCJpbiBrJiZ2b2lkIDA9PT0oZD1rLnNldChhLGQpKSkpKXRyeXtoW2JdPWR9Y2F0Y2gobCl7fX1lbHNlIHJldHVybiBrJiYiZ2V0ImluIGsmJnZvaWQgMCE9PShmPWsuZ2V0KGEsITEsZSkpP2Y6aFtiXX19LGNzczpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZjtiPWMuY2FtZWxDYXNlKGIpO2Y9Yy5jc3NIb29rc1tiXTtiPWMuY3NzUHJvcHNbYl18fGI7ImNzc0Zsb2F0Ij09PWImJihiPSJmbG9hdCIpO2lmKGYmJiJnZXQiaW4gZiYmdm9pZCAwIT09KGU9Zi5nZXQoYSwhMCxkKSkpcmV0dXJuIGU7aWYoRilyZXR1cm4gRihhLGIpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT17fSxmO2ZvcihmIGluIGIpZVtmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtjLmNhbGwoYSk7CmZvcihmIGluIGIpYS5zdHlsZVtmXT1lW2ZdfX0pO2MuY3VyQ1NTPWMuY3NzO2MuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtjLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxlLGYpe3ZhciBnO2lmKGUpe2lmKDAhPT1hLm9mZnNldFdpZHRoKXJldHVybiBFYShhLGIsZik7Yy5zd2FwKGEsUmIsZnVuY3Rpb24oKXtnPUVhKGEsYixmKX0pO3JldHVybiBnfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoJGEudGVzdChiKSl7aWYoYj1wYXJzZUZsb2F0KGIpLDA8PWIpcmV0dXJuIGIrInB4In1lbHNlIHJldHVybiBifX19KTtjLnN1cHBvcnQub3BhY2l0eXx8KGMuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIE5iLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD0KYS5zdHlsZTthPWEuY3VycmVudFN0eWxlO3ZhciBlPWMuaXNOYU4oYik/IiI6ImFscGhhKG9wYWNpdHlceDNkIisxMDAqYisiKSIsZj1hJiZhLmZpbHRlcnx8ZC5maWx0ZXJ8fCIiO2Quem9vbT0xO2lmKDE8PWImJiIiPT09Yy50cmltKGYucmVwbGFjZSh1YSwiIikpJiYoZC5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLGEmJiFhLmZpbHRlcikpcmV0dXJuO2QuZmlsdGVyPXVhLnRlc3QoZik/Zi5yZXBsYWNlKHVhLGUpOmYrIiAiK2V9fSk7YyhmdW5jdGlvbigpe2Muc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoYy5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGQ7Yy5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7ZD1iP0YoYSwibWFyZ2luLXJpZ2h0IiwibWFyZ2luUmlnaHQiKTphLnN0eWxlLm1hcmdpblJpZ2h0fSk7cmV0dXJuIGR9fSl9KTttLmRlZmF1bHRWaWV3JiZtLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJgooYWI9ZnVuY3Rpb24oYSxiKXt2YXIgZCxlO2I9Yi5yZXBsYWNlKE9iLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKGU9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KXtpZihlPWUuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKWQ9ZS5nZXRQcm9wZXJ0eVZhbHVlKGIpLCIiIT09ZHx8Yy5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpfHwoZD1jLnN0eWxlKGEsYikpO3JldHVybiBkfX0pO20uZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJiPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGU9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlW2JdLGY9YS5zdHlsZTshJGEudGVzdChjKSYmUGIudGVzdChjKSYmKGI9Zi5sZWZ0LGUmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGM9Zi5waXhlbExlZnQrInB4IixmLmxlZnQ9YixlJiYoYS5ydW50aW1lU3R5bGUubGVmdD0KZSkpO3JldHVybiIiPT09Yz8iYXV0byI6Y30pO0Y9YWJ8fGJiO2MuZXhwciYmYy5leHByLmZpbHRlcnMmJihjLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIDA9PT1hLm9mZnNldFdpZHRoJiYwPT09Ynx8IWMuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJiJub25lIj09PShhLnN0eWxlLmRpc3BsYXl8fGMuY3NzKGEsImRpc3BsYXkiKSl9LGMuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWMuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBTYj0vJTIwL2csdGI9L1xbXF0kLyxjYj0vXHI/XG4vZyxUYj0vIy4qJC8sVWI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxWYj0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksCldiPS9eKD86R0VUfEhFQUQpJC8sWGI9L15cL1wvLyxkYj0vXD8vLFliPS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLFpiPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pLEdhPS9ccysvLCRiPS8oWz8mXSlfPVteJl0qLyxlYj0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspKT8pPy8sZmI9Yy5mbi5sb2FkLGphPXt9LGdiPXt9LE4sSjt0cnl7Tj12Yi5ocmVmfWNhdGNoKGEpe049bS5jcmVhdGVFbGVtZW50KCJhIiksTi5ocmVmPSIiLE49Ti5ocmVmfUo9ZWIuZXhlYyhOLnRvTG93ZXJDYXNlKCkpfHxbXTtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYoInN0cmluZyIhPT10eXBlb2YgYSYmZmIpcmV0dXJuIGZiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGU9YS5pbmRleE9mKCIgIik7aWYoMDw9ZSl7dmFyIGY9YS5zbGljZShlLGEubGVuZ3RoKTsKYT1hLnNsaWNlKDAsZSl9ZT0iR0VUIjtiJiYoYy5pc0Z1bmN0aW9uKGIpPyhkPWIsYj12b2lkIDApOiJvYmplY3QiPT09dHlwZW9mIGImJihiPWMucGFyYW0oYixjLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksZT0iUE9TVCIpKTt2YXIgZz10aGlzO2MuYWpheCh7dXJsOmEsdHlwZTplLGRhdGFUeXBlOiJodG1sIixkYXRhOmIsY29tcGxldGU6ZnVuY3Rpb24oYSxiLGUpe2U9YS5yZXNwb25zZVRleHQ7YS5pc1Jlc29sdmVkKCkmJihhLmRvbmUoZnVuY3Rpb24oYSl7ZT1hfSksZy5odG1sKGY/YygiXHgzY2Rpdlx4M2UiKS5hcHBlbmQoZS5yZXBsYWNlKFliLCIiKSkuZmluZChmKTplKSk7ZCYmZy5lYWNoKGQsW2UsYixhXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/CmMubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8WmIudGVzdCh0aGlzLm5vZGVOYW1lKXx8VmIudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe2E9Yyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09YT9udWxsOmMuaXNBcnJheShhKT9jLm1hcChhLGZ1bmN0aW9uKGEsYyl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShjYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoY2IsIlxyXG4iKX19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iaW5kKGIsYSl9fSk7Yy5lYWNoKFsiZ2V0IiwicG9zdCJdLApmdW5jdGlvbihhLGIpe2NbYl09ZnVuY3Rpb24oYSxlLGYsZyl7Yy5pc0Z1bmN0aW9uKGUpJiYoZz1nfHxmLGY9ZSxlPXZvaWQgMCk7cmV0dXJuIGMuYWpheCh7dHlwZTpiLHVybDphLGRhdGE6ZSxzdWNjZXNzOmYsZGF0YVR5cGU6Z30pfX0pO2MuZXh0ZW5kKHtnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSx2b2lkIDAsYiwic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmdldChhLGIsZCwianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP0hhKGEsYy5hamF4U2V0dGluZ3MpOihiPWEsYT1jLmFqYXhTZXR0aW5ncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgSy5ndWFyZEN1cnJlbnQmJihiLnN1Y2Nlc3MmJihiLnN1Y2Nlc3M9Sy5ndWFyZEN1cnJlbnQoYi5zdWNjZXNzKSksYi5lcnJvciYmKGIuZXJyb3I9Sy5ndWFyZEN1cnJlbnQoYi5lcnJvcikpKTtIYShhLGIpO3JldHVybiBhfSxhamF4U2V0dGluZ3M6e3VybDpOLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KEpbMV0pLApnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6IiovKiJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpxLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpjLnBhcnNlSlNPTiwidGV4dCB4bWwiOmMucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6RmEoamEpLGFqYXhUcmFuc3BvcnQ6RmEoZ2IpLGFqYXg6ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gZChhLGIsZCxtKXtpZigyIT09eil7ej0yO3kmJmNsZWFyVGltZW91dCh5KTt3PXZvaWQgMDt4PW18fCIiO3IucmVhZHlTdGF0ZT0wPGE/NDowO3ZhciBwLHEsdDttPWI7aWYoZCl7dmFyIHY9ZSxZPXIsdT12LmNvbnRlbnRzLEg9di5kYXRhVHlwZXMsRD12LnJlc3BvbnNlRmllbGRzLEMsQixQLEs7Zm9yKEIgaW4gRClCIGluIGQmJihZW0RbQl1dPWRbQl0pO2Zvcig7IioiPT09SFswXTspSC5zaGlmdCgpLHZvaWQgMD09PUMmJihDPXYubWltZVR5cGV8fFkuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihDKWZvcihCIGluIHUpaWYodVtCXSYmdVtCXS50ZXN0KEMpKXtILnVuc2hpZnQoQik7YnJlYWt9aWYoSFswXWluIGQpUD1IWzBdO2Vsc2V7Zm9yKEIgaW4gZCl7aWYoIUhbMF18fHYuY29udmVydGVyc1tCKyIgIitIWzBdXSl7UD1CO2JyZWFrfUt8fChLPUIpfVA9UHx8S31QPyhQIT09SFswXSYmSC51bnNoaWZ0KFApLGQ9ZFtQXSk6ZD12b2lkIDB9ZWxzZSBkPQp2b2lkIDA7aWYoMjAwPD1hJiYzMDA+YXx8MzA0PT09YSl7aWYoZS5pZk1vZGlmaWVkKXtpZihDPXIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSljLmxhc3RNb2RpZmllZFtuXT1DO2lmKEM9ci5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpKWMuZXRhZ1tuXT1DfWlmKDMwND09PWEpbT0ibm90bW9kaWZpZWQiLHA9ITA7ZWxzZSB0cnl7Qz1lO0MuZGF0YUZpbHRlciYmKGQ9Qy5kYXRhRmlsdGVyKGQsQy5kYXRhVHlwZSkpO3ZhciBMPUMuZGF0YVR5cGVzO0I9e307dmFyIEUsSSxOPUwubGVuZ3RoLEosUT1MWzBdLEYsTSxSLFQsRztmb3IoRT0xO0U8TjtFKyspe2lmKDE9PT1FKWZvcihJIGluIEMuY29udmVydGVycykic3RyaW5nIj09PXR5cGVvZiBJJiYoQltJLnRvTG93ZXJDYXNlKCldPUMuY29udmVydGVyc1tJXSk7Rj1RO1E9TFtFXTtpZigiKiI9PT1RKVE9RjtlbHNlIGlmKCIqIiE9PUYmJkYhPT1RKXtNPUYrIiAiK1E7Uj1CW01dfHxCWyIqICIrUV07aWYoIVIpZm9yKFQgaW4gRz0Kdm9pZCAwLEIpaWYoSj1ULnNwbGl0KCIgIiksSlswXT09PUZ8fCIqIj09PUpbMF0paWYoRz1CW0pbMV0rIiAiK1FdKXtUPUJbVF07ITA9PT1UP1I9RzohMD09PUcmJihSPVQpO2JyZWFrfVJ8fEd8fGMuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK00ucmVwbGFjZSgiICIsIiB0byAiKSk7ITAhPT1SJiYoZD1SP1IoZCk6RyhUKGQpKSl9fXE9ZDttPSJzdWNjZXNzIjtwPSEwfWNhdGNoKFMpe209InBhcnNlcmVycm9yIix0PVN9fWVsc2UgaWYodD1tLCFtfHxhKW09ImVycm9yIiwwPmEmJihhPTApO3Iuc3RhdHVzPWE7ci5zdGF0dXNUZXh0PSIiKyhifHxtKTtwP2gucmVzb2x2ZVdpdGgoZixbcSxtLHJdKTpoLnJlamVjdFdpdGgoZixbcixtLHRdKTtyLnN0YXR1c0NvZGUobCk7bD12b2lkIDA7QSYmZy50cmlnZ2VyKCJhamF4IisocD8iU3VjY2VzcyI6IkVycm9yIiksW3IsZSxwP3E6dF0pO2sucmVzb2x2ZVdpdGgoZixbcixtXSk7QSYmKGcudHJpZ2dlcigiYWpheENvbXBsZXRlIixbciwKZV0pLC0tYy5hY3RpdmV8fGMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fSJvYmplY3QiPT09dHlwZW9mIGEmJihiPWEsYT12b2lkIDApO2I9Ynx8e307dmFyIGU9Yy5hamF4U2V0dXAoe30sYiksZj1lLmNvbnRleHR8fGUsZz1mIT09ZSYmKGYubm9kZVR5cGV8fGYgaW5zdGFuY2VvZiBjKT9jKGYpOmMuZXZlbnQsaD1jLkRlZmVycmVkKCksaz1jLl9EZWZlcnJlZCgpLGw9ZS5zdGF0dXNDb2RlfHx7fSxuLG09e30scT17fSx4LHQsdyx5LHo9MCxBLHYscj17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXtpZigheil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO2E9cVtjXT1xW2NdfHxhO21bYV09Yn1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT16P3g6bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMj09PXope2lmKCF0KWZvcih0PXt9O2I9VWIuZXhlYyh4KTspdFtiWzFdLnRvTG93ZXJDYXNlKCldPQpiWzJdO2I9dFthLnRvTG93ZXJDYXNlKCldfXJldHVybiB2b2lkIDA9PT1iP251bGw6Yn0sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXt6fHwoZS5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiO3cmJncuYWJvcnQoYSk7ZCgwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHIpO3Iuc3VjY2Vzcz1yLmRvbmU7ci5lcnJvcj1yLmZhaWw7ci5jb21wbGV0ZT1rLmRvbmU7ci5zdGF0dXNDb2RlPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiO2lmKDI+eilmb3IoYiBpbiBhKWxbYl09W2xbYl0sYVtiXV07ZWxzZSBiPWFbci5zdGF0dXNdLHIudGhlbihiLGIpfXJldHVybiB0aGlzfTtlLnVybD0oKGF8fGUudXJsKSsiIikucmVwbGFjZShUYiwiIikucmVwbGFjZShYYixKWzFdKyIvLyIpO2UuZGF0YVR5cGVzPWMudHJpbShlLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoR2EpO251bGw9PWUuY3Jvc3NEb21haW4mJihhPWViLmV4ZWMoZS51cmwudG9Mb3dlckNhc2UoKSksCmUuY3Jvc3NEb21haW49ISghYXx8YVsxXT09SlsxXSYmYVsyXT09SlsyXSYmKGFbM118fCgiaHR0cDoiPT09YVsxXT84MDo0NDMpKT09KEpbM118fCgiaHR0cDoiPT09SlsxXT84MDo0NDMpKSkpO2UuZGF0YSYmZS5wcm9jZXNzRGF0YSYmInN0cmluZyIhPT10eXBlb2YgZS5kYXRhJiYoZS5kYXRhPWMucGFyYW0oZS5kYXRhLGUudHJhZGl0aW9uYWwpKTtiYShqYSxlLGIscik7aWYoMj09PXopcmV0dXJuITE7QT1lLmdsb2JhbDtlLnR5cGU9ZS50eXBlLnRvVXBwZXJDYXNlKCk7ZS5oYXNDb250ZW50PSFXYi50ZXN0KGUudHlwZSk7QSYmMD09PWMuYWN0aXZlKysmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWUuaGFzQ29udGVudCYmKGUuZGF0YSYmKGUudXJsKz0oZGIudGVzdChlLnVybCk/Ilx4MjYiOiI/IikrZS5kYXRhLGRlbGV0ZSBlLmRhdGEpLG49ZS51cmwsITE9PT1lLmNhY2hlKSl7YT1jLm5vdygpO3ZhciBEPWUudXJsLnJlcGxhY2UoJGIsIiQxX1x4M2QiK2EpOwplLnVybD1EKyhEPT09ZS51cmw/KGRiLnRlc3QoZS51cmwpPyJceDI2IjoiPyIpKyJfXHgzZCIrYToiIil9KGUuZGF0YSYmZS5oYXNDb250ZW50JiYhMSE9PWUuY29udGVudFR5cGV8fGIuY29udGVudFR5cGUpJiZyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZS5jb250ZW50VHlwZSk7ZS5pZk1vZGlmaWVkJiYobj1ufHxlLnVybCxjLmxhc3RNb2RpZmllZFtuXSYmci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsYy5sYXN0TW9kaWZpZWRbbl0pLGMuZXRhZ1tuXSYmci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixjLmV0YWdbbl0pKTtyLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZS5kYXRhVHlwZXNbMF0mJmUuYWNjZXB0c1tlLmRhdGFUeXBlc1swXV0/ZS5hY2NlcHRzW2UuZGF0YVR5cGVzWzBdXSsoIioiIT09ZS5kYXRhVHlwZXNbMF0/IiwgKi8qOyBxXHgzZDAuMDEiOiIiKTplLmFjY2VwdHNbIioiXSk7Zm9yKHYgaW4gZS5oZWFkZXJzKXIuc2V0UmVxdWVzdEhlYWRlcih2LAplLmhlYWRlcnNbdl0pO2lmKGUuYmVmb3JlU2VuZCYmKCExPT09ZS5iZWZvcmVTZW5kLmNhbGwoZixyLGUpfHwyPT09eikpcmV0dXJuIHIuYWJvcnQoKSwhMTtmb3IodiBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSlyW3ZdKGVbdl0pO2lmKHc9YmEoZ2IsZSxiLHIpKXtyLnJlYWR5U3RhdGU9MTtBJiZnLnRyaWdnZXIoImFqYXhTZW5kIixbcixlXSk7ZS5hc3luYyYmMDxlLnRpbWVvdXQmJih5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmFib3J0KCJ0aW1lb3V0Iil9LGUudGltZW91dCkpO3RyeXt6PTEsdy5zZW5kKG0sZCl9Y2F0Y2goZGEpezI+ej9kKC0xLGRhKTpjLmVycm9yKGRhKX19ZWxzZSBkKC0xLCJObyBUcmFuc3BvcnQiKTtyZXR1cm4gcn0scGFyYW06ZnVuY3Rpb24oYSxiKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1jLmlzRnVuY3Rpb24oYik/YigpOmI7ZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyJceDNkIitlbmNvZGVVUklDb21wb25lbnQoYil9Owp2b2lkIDA9PT1iJiYoYj1jLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoYy5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWMuaXNQbGFpbk9iamVjdChhKSljLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGYgaW4gYSlrYShmLGFbZl0sYixlKTtyZXR1cm4gZC5qb2luKCJceDI2IikucmVwbGFjZShTYiwiKyIpfX0pO2MuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBhYz1jLm5vdygpLGdhPS8oXD0pXD8oJnwkKXxcP1w/L2k7Yy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBjLmV4cGFuZG8rIl8iK2FjKyt9fSk7Yy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihhLGIsZCl7Yj0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09PWEuY29udGVudFR5cGUmJiJzdHJpbmciPT09dHlwZW9mIGEuZGF0YTsKaWYoImpzb25wIj09PWEuZGF0YVR5cGVzWzBdfHwhMSE9PWEuanNvbnAmJihnYS50ZXN0KGEudXJsKXx8YiYmZ2EudGVzdChhLmRhdGEpKSl7dmFyIGUsZj1hLmpzb25wQ2FsbGJhY2s9Yy5pc0Z1bmN0aW9uKGEuanNvbnBDYWxsYmFjayk/YS5qc29ucENhbGxiYWNrKCk6YS5qc29ucENhbGxiYWNrLGc9cVtmXSxoPWEudXJsLGs9YS5kYXRhLGw9IiQxIitmKyIkMiI7ITEhPT1hLmpzb25wJiYoaD1oLnJlcGxhY2UoZ2EsbCksYS51cmw9PT1oJiYoYiYmKGs9ay5yZXBsYWNlKGdhLGwpKSxhLmRhdGE9PT1rJiYoaCs9KC9cPy8udGVzdChoKT8iXHgyNiI6Ij8iKSthLmpzb25wKyJceDNkIitmKSkpO2EudXJsPWg7YS5kYXRhPWs7cVtmXT1mdW5jdGlvbihhKXtlPVthXX07ZC5hbHdheXMoZnVuY3Rpb24oKXtxW2ZdPWc7aWYoZSYmYy5pc0Z1bmN0aW9uKGcpKXFbZl0oZVswXSl9KTthLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtlfHxjLmVycm9yKGYrIiB3YXMgbm90IGNhbGxlZCIpOwpyZXR1cm4gZVswXX07YS5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pO2MuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtjLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pO2MuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXt2b2lkIDA9PT1hLmNhY2hlJiYoYS5jYWNoZT0hMSk7YS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KTtjLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGIsYz1tLmhlYWR8fG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Cm0uZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7Yj1tLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2IuYXN5bmM9ImFzeW5jIjthLnNjcmlwdENoYXJzZXQmJihiLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KTtiLnNyYz1hLnVybDtiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGUpe2lmKGV8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSliLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGMmJmIucGFyZW50Tm9kZSYmYy5yZW1vdmVDaGlsZChiKSxiPXZvaWQgMCxlfHxmKDIwMCwic3VjY2VzcyIpfTtjLmluc2VydEJlZm9yZShiLGMuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7aWYoYiliLm9ubG9hZCgwLDEpfX19fSk7dmFyIHZhPXEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBTKVNbYV0oMCwxKX06ITEsYmM9MCxTO2MuYWpheFNldHRpbmdzLnhocj0KcS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7dmFyIGE7aWYoIShhPSF0aGlzLmlzTG9jYWwmJklhKCkpKWE6e3RyeXthPW5ldyBxLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7YnJlYWsgYX1jYXRjaChiKXt9YT12b2lkIDB9cmV0dXJuIGF9OklhOyhmdW5jdGlvbihhKXtjLmV4dGVuZChjLnN1cHBvcnQse2FqYXg6ISFhLGNvcnM6ISFhJiYid2l0aENyZWRlbnRpYWxzImluIGF9KX0pKGMuYWpheFNldHRpbmdzLnhocigpKTtjLnN1cHBvcnQuYWpheCYmYy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxjLnN1cHBvcnQuY29ycyl7dmFyIGI7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXt2YXIgZj1hLnhocigpLGcsaDthLnVzZXJuYW1lP2Yub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpOmYub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyk7aWYoYS54aHJGaWVsZHMpZm9yKGggaW4gYS54aHJGaWVsZHMpZltoXT0KYS54aHJGaWVsZHNbaF07YS5taW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUoYS5taW1lVHlwZSk7YS5jcm9zc0RvbWFpbnx8ZFsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZFsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IoaCBpbiBkKWYuc2V0UmVxdWVzdEhlYWRlcihoLGRbaF0pfWNhdGNoKGspe31mLnNlbmQoYS5oYXNDb250ZW50JiZhLmRhdGF8fG51bGwpO2I9ZnVuY3Rpb24oZCxoKXt2YXIgbixtLHEseCx0O3RyeXtpZihiJiYoaHx8ND09PWYucmVhZHlTdGF0ZSkpaWYoYj12b2lkIDAsZyYmKGYub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcCx2YSYmZGVsZXRlIFNbZ10pLGgpNCE9PWYucmVhZHlTdGF0ZSYmZi5hYm9ydCgpO2Vsc2V7bj1mLnN0YXR1cztxPWYuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7eD17fTsodD1mLnJlc3BvbnNlWE1MKSYmdC5kb2N1bWVudEVsZW1lbnQmJih4LnhtbD10KTt4LnRleHQ9CmYucmVzcG9uc2VUZXh0O3RyeXttPWYuc3RhdHVzVGV4dH1jYXRjaCh3KXttPSIifW58fCFhLmlzTG9jYWx8fGEuY3Jvc3NEb21haW4/MTIyMz09PW4mJihuPTIwNCk6bj14LnRleHQ/MjAwOjQwNH19Y2F0Y2godyl7aHx8ZSgtMSx3KX14JiZlKG4sbSx4LHEpfTthLmFzeW5jJiY0IT09Zi5yZWFkeVN0YXRlPyhnPSsrYmMsdmEmJihTfHwoUz17fSxjKHEpLnVubG9hZCh2YSkpLFNbZ109YiksZi5vbnJlYWR5c3RhdGVjaGFuZ2U9Yik6YigpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIoMCwxKX19fX0pO3ZhciBsYT17fSxBLEcsY2M9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGRjPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksaGEsS2E9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSwKWyJvcGFjaXR5Il1dLGNhO2MuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKGEsYixkKXtpZihhfHwwPT09YSlyZXR1cm4gdGhpcy5hbmltYXRlKE0oInNob3ciLDMpLGEsYixkKTtkPTA7Zm9yKHZhciBlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspYT10aGlzW2RdLGEuc3R5bGUmJihiPWEuc3R5bGUuZGlzcGxheSxjLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8Im5vbmUiIT09Ynx8KGI9YS5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PWImJiJub25lIj09PWMuY3NzKGEsImRpc3BsYXkiKSYmYy5fZGF0YShhLCJvbGRkaXNwbGF5IixMYShhLm5vZGVOYW1lKSkpO2ZvcihkPTA7ZDxlO2QrKylpZihhPXRoaXNbZF0sYS5zdHlsZSYmKGI9YS5zdHlsZS5kaXNwbGF5LCIiPT09Ynx8Im5vbmUiPT09YikpYS5zdHlsZS5kaXNwbGF5PWMuX2RhdGEoYSwib2xkZGlzcGxheSIpfHwiIjtyZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsZCl7aWYoYXx8MD09PWEpcmV0dXJuIHRoaXMuYW5pbWF0ZShNKCJoaWRlIiwKMyksYSxiLGQpO2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUmJihkPWMuY3NzKHRoaXNbYV0sImRpc3BsYXkiKSwibm9uZSI9PT1kfHxjLl9kYXRhKHRoaXNbYV0sIm9sZGRpc3BsYXkiKXx8Yy5fZGF0YSh0aGlzW2FdLCJvbGRkaXNwbGF5IixkKSk7Zm9yKGE9MDthPGI7YSsrKXRoaXNbYV0uc3R5bGUmJih0aGlzW2FdLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtyZXR1cm4gdGhpc30sX3RvZ2dsZTpjLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPSJib29sZWFuIj09PXR5cGVvZiBhO2MuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bnVsbD09YXx8ZT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1lP2E6Yyh0aGlzKS5pcygiOmhpZGRlbiIpO2ModGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKE0oInRvZ2dsZSIsMyksYSxiLGQpO3JldHVybiB0aGlzfSwKZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGUpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGUpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPWMuc3BlZWQoYixkLGUpO2lmKGMuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGYuY29tcGxldGUsWyExXSk7YT1jLmV4dGVuZCh7fSxhKTtyZXR1cm4gdGhpc1shMT09PWYucXVldWU/ImVhY2giOiJxdWV1ZSJdKGZ1bmN0aW9uKCl7ITE9PT1mLnF1ZXVlJiZjLl9tYXJrKHRoaXMpO3ZhciBiPWMuZXh0ZW5kKHt9LGYpLGQ9MT09PXRoaXMubm9kZVR5cGUsZT1kJiZjKHRoaXMpLmlzKCI6aGlkZGVuIiksbCxuLG0scSx4O2IuYW5pbWF0ZWRQcm9wZXJ0aWVzPXt9O2ZvcihtIGluIGEpe2w9Yy5jYW1lbENhc2UobSk7bSE9PWwmJihhW2xdPWFbbV0sZGVsZXRlIGFbbV0pO249YVtsXTtjLmlzQXJyYXkobik/KGIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2xdPQpuWzFdLG49YVtsXT1uWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tsXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tsXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoImhpZGUiPT09biYmZXx8InNob3ciPT09biYmIWUpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTshZHx8ImhlaWdodCIhPT1sJiYid2lkdGgiIT09bHx8KGIub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldLCJpbmxpbmUiPT09Yy5jc3ModGhpcywiZGlzcGxheSIpJiYibm9uZSI9PT1jLmNzcyh0aGlzLCJmbG9hdCIpJiYoYy5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ/KG49TGEodGhpcy5ub2RlTmFtZSksImlubGluZSI9PT1uP3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjoodGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHRoaXMuc3R5bGUuem9vbT0xKSk6dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSl9bnVsbCE9CmIub3ZlcmZsb3cmJih0aGlzLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKTtmb3IobSBpbiBhKWlmKGQ9bmV3IGMuZngodGhpcyxiLG0pLG49YVttXSxjYy50ZXN0KG4pKWRbInRvZ2dsZSI9PT1uP2U/InNob3ciOiJoaWRlIjpuXSgpO2Vsc2UgbD1kYy5leGVjKG4pLHE9ZC5jdXIoKSxsPyhuPXBhcnNlRmxvYXQobFsyXSkseD1sWzNdfHwoYy5jc3NOdW1iZXJbbV0/IiI6InB4IiksInB4IiE9PXgmJihjLnN0eWxlKHRoaXMsbSwobnx8MSkreCkscSo9KG58fDEpL2QuY3VyKCksYy5zdHlsZSh0aGlzLG0scSt4KSksbFsxXSYmKG49KCItXHgzZCI9PT1sWzFdPy0xOjEpKm4rcSksZC5jdXN0b20ocSxuLHgpKTpkLmN1c3RvbShxLG4sIiIpO3JldHVybiEwfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXthJiZ0aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYT1jLnRpbWVycyxlPWEubGVuZ3RoO2ZvcihifHxjLl91bm1hcmsoITAsdGhpcyk7ZS0tOylpZihhW2VdLmVsZW09PT0KdGhpcyl7aWYoYilhW2VdKCEwKTthLnNwbGljZShlLDEpfX0pO2J8fHRoaXMuZGVxdWV1ZSgpO3JldHVybiB0aGlzfX0pO2MuZWFjaCh7c2xpZGVEb3duOk0oInNob3ciLDEpLHNsaWRlVXA6TSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6TSgidG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7Yy5mblthXT1mdW5jdGlvbihhLGMsZil7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEmJiJvYmplY3QiPT09dHlwZW9mIGE/Yy5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmR8fCFkJiZifHxjLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6ZCYmYnx8YiYmIWMuaXNGdW5jdGlvbihiKSYmYn07ZS5kdXJhdGlvbj1jLmZ4Lm9mZj8wOiJudW1iZXIiPT09dHlwZW9mIGUuZHVyYXRpb24/CmUuZHVyYXRpb246ZS5kdXJhdGlvbiBpbiBjLmZ4LnNwZWVkcz9jLmZ4LnNwZWVkc1tlLmR1cmF0aW9uXTpjLmZ4LnNwZWVkcy5fZGVmYXVsdDtlLm9sZD1lLmNvbXBsZXRlO2UuY29tcGxldGU9ZnVuY3Rpb24oYSl7Yy5pc0Z1bmN0aW9uKGUub2xkKSYmZS5vbGQuY2FsbCh0aGlzKTshMSE9PWUucXVldWU/Yy5kZXF1ZXVlKHRoaXMpOiExIT09YSYmYy5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZX0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZSl7cmV0dXJuIGMrZSphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxlKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZStjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yjt0aGlzLmVsZW09YTt0aGlzLnByb3A9YztiLm9yaWc9Yi5vcmlnfHx7fX19KTtjLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLAp0aGlzLm5vdyx0aGlzKTsoYy5meC5zdGVwW3RoaXMucHJvcF18fGMuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuZWxlbVt0aGlzLnByb3BdJiYoIXRoaXMuZWxlbS5zdHlsZXx8bnVsbD09dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF0pKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWMuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpP2ImJiJhdXRvIiE9PWI/YjowOmF9LGN1c3RvbTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZShhKXtyZXR1cm4gZi5zdGVwKGEpfXZhciBmPXRoaXMsZz1jLmZ4O3RoaXMuc3RhcnRUaW1lPWNhfHxKYSgpO3RoaXMuc3RhcnQ9YTt0aGlzLmVuZD1iO3RoaXMudW5pdD1kfHx0aGlzLnVuaXR8fChjLmNzc051bWJlclt0aGlzLnByb3BdPyIiOiJweCIpO3RoaXMubm93PXRoaXMuc3RhcnQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0wO2UuZWxlbT0KdGhpcy5lbGVtO2UoKSYmYy50aW1lcnMucHVzaChlKSYmIWhhJiYoaGE9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Yy5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMuc2hvdz0hMDt0aGlzLmN1c3RvbSgid2lkdGgiPT09dGhpcy5wcm9wfHwiaGVpZ2h0Ij09PXRoaXMucHJvcD8xOjAsdGhpcy5jdXIoKSk7Yyh0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Yy5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMuaGlkZT0hMDt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPWNhfHxKYSgpLGQ9ITAsZT10aGlzLmVsZW0sZj10aGlzLm9wdGlvbnMsZztpZihhfHxiPj1mLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZDsKdGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7Zi5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXT0hMDtmb3IoZyBpbiBmLmFuaW1hdGVkUHJvcGVydGllcykhMCE9PWYuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddJiYoZD0hMSk7aWYoZCl7bnVsbD09Zi5vdmVyZmxvd3x8Yy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3N8fGMuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtlLnN0eWxlWyJvdmVyZmxvdyIrYl09Zi5vdmVyZmxvd1thXX0pO2YuaGlkZSYmYyhlKS5oaWRlKCk7aWYoZi5oaWRlfHxmLnNob3cpZm9yKHZhciBoIGluIGYuYW5pbWF0ZWRQcm9wZXJ0aWVzKWMuc3R5bGUoZSxoLGYub3JpZ1toXSk7Zi5jb21wbGV0ZS5jYWxsKGUpfXJldHVybiExfUluZmluaXR5PT1mLmR1cmF0aW9uP3RoaXMubm93PWI6KGE9Yi10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWEvZi5kdXJhdGlvbix0aGlzLnBvcz1jLmVhc2luZ1tmLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLAphLDAsMSxmLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyk7dGhpcy51cGRhdGUoKTtyZXR1cm4hMH19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9Yy50aW1lcnMsYj0wO2I8YS5sZW5ndGg7KytiKWFbYl0oKXx8YS5zcGxpY2UoYi0tLDEpO2EubGVuZ3RofHxjLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoaGEpO2hhPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Muc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtLnN0eWxlW2EucHJvcF09KCJ3aWR0aCI9PT1hLnByb3B8fCJoZWlnaHQiPT09YS5wcm9wP01hdGgubWF4KDAsYS5ub3cpOgphLm5vdykrYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KTtjLmV4cHImJmMuZXhwci5maWx0ZXJzJiYoYy5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZ3JlcChjLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBlYz0vXnQoPzphYmxlfGR8aCkkL2ksaGI9L14oPzpib2R5fGh0bWwpJC9pO2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gbS5kb2N1bWVudEVsZW1lbnQ/ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxkO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtkPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZyl7fXZhciBlPQpiLm93bmVyRG9jdW1lbnQsZj1lLmRvY3VtZW50RWxlbWVudDtpZighZHx8IWMuY29udGFpbnMoZixiKSlyZXR1cm4gZD97dG9wOmQudG9wLGxlZnQ6ZC5sZWZ0fTp7dG9wOjAsbGVmdDowfTtiPWUuYm9keTtlPW1hKGUpO3JldHVybnt0b3A6ZC50b3ArKGUucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmZi5zY3JvbGxUb3B8fGIuc2Nyb2xsVG9wKS0oZi5jbGllbnRUb3B8fGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoZS5wYWdlWE9mZnNldHx8Yy5zdXBwb3J0LmJveE1vZGVsJiZmLnNjcm9sbExlZnR8fGIuc2Nyb2xsTGVmdCktKGYuY2xpZW50TGVmdHx8Yi5jbGllbnRMZWZ0fHwwKX19OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7CmMub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZCxlPWIub2Zmc2V0UGFyZW50LGY9Yi5vd25lckRvY3VtZW50LGc9Zi5kb2N1bWVudEVsZW1lbnQsaD1mLmJvZHk7ZD0oZj1mLmRlZmF1bHRWaWV3KT9mLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZTtmb3IodmFyIGs9Yi5vZmZzZXRUb3AsbD1iLm9mZnNldExlZnQ7KGI9Yi5wYXJlbnROb2RlKSYmYiE9PWgmJmIhPT1nJiYoIWMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbnx8ImZpeGVkIiE9PWQucG9zaXRpb24pOylkPWY/Zi5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGUsay09Yi5zY3JvbGxUb3AsbC09Yi5zY3JvbGxMZWZ0LGI9PT1lJiYoays9Yi5vZmZzZXRUb3AsbCs9Yi5vZmZzZXRMZWZ0LCFjLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyfHxjLm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscyYmZWMudGVzdChiLm5vZGVOYW1lKXx8KGsrPXBhcnNlRmxvYXQoZC5ib3JkZXJUb3BXaWR0aCl8fAowLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxlPWIub2Zmc2V0UGFyZW50KSxjLm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUmJiJ2aXNpYmxlIiE9PWQub3ZlcmZsb3cmJihrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKTtpZigicmVsYXRpdmUiPT09ZC5wb3NpdGlvbnx8InN0YXRpYyI9PT1kLnBvc2l0aW9uKWsrPWgub2Zmc2V0VG9wLGwrPWgub2Zmc2V0TGVmdDtjLm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJiJmaXhlZCI9PT1kLnBvc2l0aW9uJiYoays9TWF0aC5tYXgoZy5zY3JvbGxUb3AsaC5zY3JvbGxUb3ApLGwrPU1hdGgubWF4KGcuc2Nyb2xsTGVmdCxoLnNjcm9sbExlZnQpKTtyZXR1cm57dG9wOmssbGVmdDpsfX07Yy5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT1tLmJvZHksYj1tLmNyZWF0ZUVsZW1lbnQoImRpdiIpLApkLGUsZixnPXBhcnNlRmxvYXQoYy5jc3MoYSwibWFyZ2luVG9wIikpfHwwO2MuZXh0ZW5kKGIuc3R5bGUse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLGJvcmRlcjowLHdpZHRoOiIxcHgiLGhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSk7Yi5pbm5lckhUTUw9Ilx4M2NkaXYgc3R5bGVceDNkJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OydceDNlXHgzY2Rpdlx4M2VceDNjL2Rpdlx4M2VceDNjL2Rpdlx4M2VceDNjdGFibGUgc3R5bGVceDNkJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmdceDNkJzAnIGNlbGxzcGFjaW5nXHgzZCcwJ1x4M2VceDNjdHJceDNlXHgzY3RkXHgzZVx4M2MvdGRceDNlXHgzYy90clx4M2VceDNjL3RhYmxlXHgzZSI7CmEuaW5zZXJ0QmVmb3JlKGIsYS5maXJzdENoaWxkKTtkPWIuZmlyc3RDaGlsZDtlPWQuZmlyc3RDaGlsZDtmPWQubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkO3RoaXMuZG9lc05vdEFkZEJvcmRlcj01IT09ZS5vZmZzZXRUb3A7dGhpcy5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscz01PT09Zi5vZmZzZXRUb3A7ZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2Uuc3R5bGUudG9wPSIyMHB4Ijt0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbj0yMD09PWUub2Zmc2V0VG9wfHwxNT09PWUub2Zmc2V0VG9wO2Uuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiI7ZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9LTU9PT1lLm9mZnNldFRvcDt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09ZzthLnJlbW92ZUNoaWxkKGIpOwpjLm9mZnNldC5pbml0aWFsaXplPWMubm9vcH0sYm9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxkPWEub2Zmc2V0TGVmdDtjLm9mZnNldC5pbml0aWFsaXplKCk7Yy5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxkKz1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmR9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWMuY3NzKGEsInBvc2l0aW9uIik7InN0YXRpYyI9PT1lJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZj1jKGEpLGc9Zi5vZmZzZXQoKSxoPWMuY3NzKGEsInRvcCIpLGs9Yy5jc3MoYSwibGVmdCIpLGw9e307KCJhYnNvbHV0ZSI9PT1lfHwiZml4ZWQiPT09ZSkmJi0xPGMuaW5BcnJheSgiYXV0byIsW2gsa10pPyhrPWYucG9zaXRpb24oKSxlPWsudG9wLGs9ay5sZWZ0KToKKGU9cGFyc2VGbG9hdChoKXx8MCxrPXBhcnNlRmxvYXQoayl8fDApO2MuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsZCxnKSk7bnVsbCE9Yi50b3AmJihsLnRvcD1iLnRvcC1nLnRvcCtlKTtudWxsIT1iLmxlZnQmJihsLmxlZnQ9Yi5sZWZ0LWcubGVmdCtrKTsidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxsKTpmLmNzcyhsKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxlPWhiLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7ZC5sZWZ0LT1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDA7ZS50b3ArPXBhcnNlRmxvYXQoYy5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDA7ZS5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3NzKGJbMF0sCiJib3JkZXJMZWZ0V2lkdGgiKSl8fDA7cmV0dXJue3RvcDpkLnRvcC1lLnRvcCxsZWZ0OmQubGVmdC1lLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fG0uYm9keTthJiYhaGIudGVzdChhLm5vZGVOYW1lKSYmInN0YXRpYyI9PT1jLmNzcyhhLCJwb3NpdGlvbiIpOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSk7Yy5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9InNjcm9sbCIrYjtjLmZuW2RdPWZ1bmN0aW9uKGIpe3ZhciBmLGc7cmV0dXJuIHZvaWQgMD09PWI/KGY9dGhpc1swXSxmPyhnPW1hKGYpKT8icGFnZVhPZmZzZXQiaW4gZz9nW2E/InBhZ2VZT2Zmc2V0IjoicGFnZVhPZmZzZXQiXTpjLnN1cHBvcnQuYm94TW9kZWwmJmcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2RdfHxnLmRvY3VtZW50LmJvZHlbZF06ZltkXTpudWxsKTp0aGlzLmVhY2goZnVuY3Rpb24oKXsoZz0KbWEodGhpcykpP2cuc2Nyb2xsVG8oYT9jKGcpLnNjcm9sbExlZnQoKTpiLGE/YjpjKGcpLnNjcm9sbFRvcCgpKTp0aGlzW2RdPWJ9KX19KTtjLmVhY2goWyJIZWlnaHQiLCJXaWR0aCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9Yi50b0xvd2VyQ2FzZSgpO2MuZm5bImlubmVyIitiXT1mdW5jdGlvbigpe3ZhciBhPXRoaXNbMF07cmV0dXJuIGEmJmEuc3R5bGU/cGFyc2VGbG9hdChjLmNzcyhhLGQsInBhZGRpbmciKSk6bnVsbH07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07cmV0dXJuIGImJmIuc3R5bGU/cGFyc2VGbG9hdChjLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOm51bGx9O2MuZm5bZF09ZnVuY3Rpb24oYSl7dmFyIGY9dGhpc1swXTtpZighZilyZXR1cm4gbnVsbD09YT9udWxsOnRoaXM7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGY9Yyh0aGlzKTtmW2RdKGEuY2FsbCh0aGlzLGIsZltkXSgpKSl9KTsKaWYoYy5pc1dpbmRvdyhmKSl7dmFyIGc9Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl0sZj1mLmRvY3VtZW50LmJvZHk7cmV0dXJuIGMuc3VwcG9ydC5ib3hNb2RlbCYmZ3x8ZiYmZlsiY2xpZW50IitiXXx8Z31yZXR1cm4gOT09PWYubm9kZVR5cGU/TWF0aC5tYXgoZi5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl0sZi5ib2R5WyJzY3JvbGwiK2JdLGYuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2JdLGYuYm9keVsib2Zmc2V0IitiXSxmLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitiXSk6dm9pZCAwPT09YT8oZz1jLmNzcyhmLGQpLGY9cGFyc2VGbG9hdChnKSxjLmlzTmFOKGYpP2c6Zik6dGhpcy5jc3MoZCwic3RyaW5nIj09PXR5cGVvZiBhP2E6YSsicHgiKX19KTtjLmZuLm9mZnNldE5vSVBhZEZpeD1jLmZuLm9mZnNldDtjLmZuLm9mZnNldElQYWRGaXg9Yy5mbi5vZmZzZXQ7L3dlYmtpdC4qbW9iaWxlL2kudGVzdChNYS51c2VyQWdlbnQpJiY1MzIuOT5wYXJzZUZsb2F0KGMuYnJvd3Nlci52ZXJzaW9uKSYmCiJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gbS5kb2N1bWVudEVsZW1lbnQmJihjLmZuLm9mZnNldElQYWRGaXg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldE5vSVBhZEZpeCgpO2EmJihhLnRvcC09cS5zY3JvbGxZLGEubGVmdC09cS5zY3JvbGxYKTtyZXR1cm4gYX0sYy5mbi5vZmZzZXQ9Yy5mbi5vZmZzZXRJUGFkRml4KTtyZXR1cm4gY30oKSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGgpe3ZhciBlPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZj1lLl9uYW1lc3BhY2V8fGUuYXR0cmlidXRlRXJyb3JzLGc9Zj9mKCJBbWF6b25VSVByb21pc2UiLCJBbWF6b25VSSIpOmU7Zy5ndWFyZEZhdGFsP2cuZ3VhcmRGYXRhbChoKShnLHdpbmRvdyk6Zy5leGVjdXRlKGZ1bmN0aW9uKCl7aChnLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGgsZSxmKXtoLnJlZ2lzdGVyKCIzcC1wcm9taXNlIixmdW5jdGlvbigpe2Z1bmN0aW9uIGcoKXt9ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBjKGEpe2lmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Iik7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIGZ1bmN0aW9uIik7dGhpcy5fc3RhdGU9MDt0aGlzLl9oYW5kbGVkPQohMTt0aGlzLl92YWx1ZT12b2lkIDA7dGhpcy5fZGVmZXJyZWRzPVtdO3EoYSx0aGlzKX1mdW5jdGlvbiBmKGEsYil7Zm9yKDszPT09YS5fc3RhdGU7KWE9YS5fdmFsdWU7MD09PWEuX3N0YXRlP2EuX2RlZmVycmVkcy5wdXNoKGIpOihhLl9oYW5kbGVkPSEwLGwoZnVuY3Rpb24oKXt2YXIgZD0xPT09YS5fc3RhdGU/Yi5vbkZ1bGZpbGxlZDpiLm9uUmVqZWN0ZWQ7aWYobnVsbD09PWQpKDE9PT1hLl9zdGF0ZT9uOmspKGIucHJvbWlzZSxhLl92YWx1ZSk7ZWxzZXt2YXIgbTt0cnl7bT1kKGEuX3ZhbHVlKX1jYXRjaChjKXtrKGIucHJvbWlzZSxjKTtyZXR1cm59bihiLnByb21pc2UsbSl9fSkpfWZ1bmN0aW9uIG4oYSxiKXt0cnl7aWYoYj09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4iKTtpZihiJiYoIm9iamVjdCI9PT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09PXR5cGVvZiBiKSl7dmFyIGQ9Yi50aGVuO2lmKGIgaW5zdGFuY2VvZgpjKXthLl9zdGF0ZT0zO2EuX3ZhbHVlPWI7cChhKTtyZXR1cm59aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBkKXtxKGgoZCxiKSxhKTtyZXR1cm59fWEuX3N0YXRlPTE7YS5fdmFsdWU9YjtwKGEpfWNhdGNoKG0pe2soYSxtKX19ZnVuY3Rpb24gayhhLGIpe2EuX3N0YXRlPTI7YS5fdmFsdWU9YjtwKGEpfWZ1bmN0aW9uIHAoYSl7Mj09PWEuX3N0YXRlJiYwPT09YS5fZGVmZXJyZWRzLmxlbmd0aCYmbChmdW5jdGlvbigpe2EuX2hhbmRsZWR8fHIoYS5fdmFsdWUpfSk7Zm9yKHZhciBiPTAsZD1hLl9kZWZlcnJlZHMubGVuZ3RoO2I8ZDtiKyspZihhLGEuX2RlZmVycmVkc1tiXSk7YS5fZGVmZXJyZWRzPW51bGx9ZnVuY3Rpb24gdChhLGIsZCl7dGhpcy5vbkZ1bGZpbGxlZD0iZnVuY3Rpb24iPT09dHlwZW9mIGE/YTpudWxsO3RoaXMub25SZWplY3RlZD0iZnVuY3Rpb24iPT09dHlwZW9mIGI/YjpudWxsO3RoaXMucHJvbWlzZT1kfWZ1bmN0aW9uIHEoYSxiKXt2YXIgZD0hMTt0cnl7YShmdW5jdGlvbihhKXtkfHwKKGQ9ITAsbihiLGEpKX0sZnVuY3Rpb24oYSl7ZHx8KGQ9ITAsayhiLGEpKX0pfWNhdGNoKGMpe2R8fChkPSEwLGsoYixjKSl9fWlmKCJmdW5jdGlvbiI9PT10eXBlb2YgZS5Qcm9taXNlKXJldHVybiBlLlByb21pc2U7dmFyIHU9c2V0VGltZW91dCxsPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZzZXRJbW1lZGlhdGV8fGZ1bmN0aW9uKGEpe3UoYSwwKX0scj1mdW5jdGlvbihhKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEpfTtjLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O2MucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgdGhpcy5jb25zdHJ1Y3RvcihnKTtmKHRoaXMsbmV3IHQoYSxiLGQpKTtyZXR1cm4gZH07Yy5hbGw9ZnVuY3Rpb24oYSl7dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7CnJldHVybiBuZXcgYyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGcoZSxmKXt0cnl7aWYoZiYmKCJvYmplY3QiPT09dHlwZW9mIGZ8fCJmdW5jdGlvbiI9PT10eXBlb2YgZikpe3ZhciBrPWYudGhlbjtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGspe2suY2FsbChmLGZ1bmN0aW9uKGEpe2coZSxhKX0sYyk7cmV0dXJufX1iW2VdPWY7MD09PS0taCYmYShiKX1jYXRjaChsKXtjKGwpfX1pZigwPT09Yi5sZW5ndGgpcmV0dXJuIGEoW10pO2Zvcih2YXIgaD1iLmxlbmd0aCxlPTA7ZTxiLmxlbmd0aDtlKyspZyhlLGJbZV0pfSl9O2MucmVzb2x2ZT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmIm9iamVjdCI9PT10eXBlb2YgYSYmYS5jb25zdHJ1Y3Rvcj09PWM/YTpuZXcgYyhmdW5jdGlvbihiKXtiKGEpfSl9O2MucmVqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYyhmdW5jdGlvbihiLGQpe2QoYSl9KX07Yy5yYWNlPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYyhmdW5jdGlvbihiLGQpe2Zvcih2YXIgYz0KMCxlPWEubGVuZ3RoO2M8ZTtjKyspYVtjXS50aGVuKGIsZCl9KX07Yy5fc2V0SW1tZWRpYXRlRm49ZnVuY3Rpb24oYSl7bD1hfTtjLl9zZXRVbmhhbmRsZWRSZWplY3Rpb25Gbj1mdW5jdGlvbihhKXtyPWF9O3JldHVybiBjfSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKG0pe3ZhciBuPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsQz1uLl9uYW1lc3BhY2V8fG4uYXR0cmlidXRlRXJyb3JzLGQ9Qz9DKCJBbWF6b25VSUJhc2VKUyIsIkFtYXpvblVJIik6bjtkLmd1YXJkRmF0YWw/ZC5ndWFyZEZhdGFsKG0pKGQsd2luZG93KTpkLmV4ZWN1dGUoZnVuY3Rpb24oKXttKGQsd2luZG93KX0pfSkoZnVuY3Rpb24obSxuLEMpe20ud2hlbigialF1ZXJ5IikucmVnaXN0ZXIoImEtYmFzZSIsZnVuY3Rpb24oZCl7cmV0dXJue3ZlcnNpb246ZnVuY3Rpb24oKXtyZXR1cm4iMy4wIn0sJDpkfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oInAtcmVjb3JkZXItZXZlbnRzIiwialF1ZXJ5IiwiYS1hbmFseXRpY3MiLCJhLXV0aWwiLCJhLWNvbnN0YW50cyIsInBydjphLXBvc3QtYXRmIikucmVnaXN0ZXIoInBydjphLWRlY2xhcmF0aXZlLWFuYWx5dGljcyIsZnVuY3Rpb24oZCxnLGssYyxoLGIpe2Z1bmN0aW9uIGUoKXtwKCk7Yy5vYmplY3RJc0VtcHR5KHIpfHwKKGcoIltkYXRhLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIik7cVthXT0hMH0pLHAoKSxyPXt9KX1mdW5jdGlvbiBwKCl7Yy5lYWNoKHIsZnVuY3Rpb24oZixsKXtxW2YuZGFOYW1lXSYmKGsuY291bnQoInVzYWdlOnR0aSIsZi5sYXRlbmN5KSxkZWxldGUgcltsXSxhW2xdPWYpfSl9dmFyIHQ9bi51ZV90MHx8bi5hUGFnZVN0YXJ0fHxEYXRlLm5vdygpLHI9e30sYT17fSxxPXt9O3JldHVybiAwPGQubGVuZ3RoJiZuLnVlP3tub3RpZnk6ZnVuY3Rpb24oZixsKXtpZihmJiZsJiYtMSE9PWMuaW5kZXhPZkFycmF5KGQsbCkpe3ZhciBxPWYrIi8iK2w7aWYoIWFbcV0mJiFyW3FdKXt2YXIgdT1EYXRlLm5vdygpLXQ7cltxXT17ZGFOYW1lOmYsZXZlbnRUeXBlOmwsbGF0ZW5jeTp1fTtiLmV4ZWN1dGUoZSl9fX19Ontub3RpZnk6aC5jb25zdGFudHMuTk9PUCxzZXRPcHRpb25zOmguY29uc3RhbnRzLk5PT1B9fSk7InVzZSBzdHJpY3QiOwptLnJlZ2lzdGVyKCJwcnY6YS1ndWFyZCIsZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZyhkLGMpe3JldHVybiBkLl9ndWFyZCYmImZ1bmN0aW9uIj09PXR5cGVvZiBjP2QuX2d1YXJkKGMpOmN9cmV0dXJue2ZuOmcsb2JqOmZ1bmN0aW9uKGQsYyl7aWYoIWQuX2d1YXJkKXJldHVybiBjO3ZhciBoPXt9LGI7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoaFtiXT1nKGQsY1tiXSkpO3JldHVybiBofX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJwLXJlY29yZGVyLWV2ZW50cyIsImEtYW5hbHl0aWNzIikucmVnaXN0ZXIoImEtdGltaW5nLWFuYWx5dGljcyIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKGIpe2NbYl09ITA7MCE9PWQubGVuZ3RoJiZuLnVldCYmbi51ZXgmJm4udWV0KCJiYiIsYixoKX12YXIgYz17fSxoPXt3YjoxfTtrKCJkZWNsYXJhdGl2ZSIpO2soIkEiKTtrKCJkcm9wZG93biIpO2soImNhcm91c2VsIik7cmV0dXJue3N0YXJ0V2lkZ2V0TG9nZ2luZzprLHN0b3BXaWRnZXRMb2dnaW5nOmZ1bmN0aW9uKGIpezAhPT0KZC5sZW5ndGgmJm4udWV0JiZuLnVleCYmYiBpbiBjJiYobi51ZXQoImNmIixiLGgpLG4udWV4KCJsZCIsYixoKSl9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oInAtcmVjb3JkZXItZXZlbnRzIiwialF1ZXJ5IiwiYS1hbmFseXRpY3MiLCJhLXV0aWwiLCJwcnY6YS1ldmVudC1jb250ZXh0IiwicHJ2OmEtcG9zdC1hdGYiKS5yZWdpc3RlcigiYS1ldmVudC1hbmFseXRpY3MiLGZ1bmN0aW9uKGQsZyxrLGMsaCxiKXtmdW5jdGlvbiBlKGEsZil7YT1hKyI6IitmO3JldHVybiBhIGluIHo/KGY9elthXSxkZWxldGUgelthXSxmKTpbXX1mdW5jdGlvbiBwKGEsZixsKXt2YXIgcT1lKGEsZik7aWYocSYmcS5sZW5ndGgpdHJ5e2suaW5jcmVtZW50KCJ1c2FnZTp0cnVlX3VkYWMiLHEubGVuZ3RoKTt2YXIgeD0iVXNlciBhdHRlbXB0ZWQgdG8gaW50ZXJhY3Qgd2l0aCBkZWNsYXJhdGl2ZSBhY3Rpb24gYmVmb3JlIGl0IHdhcyByZWFkeS4gKGF1aXx0cnVlX3VkYWM6IitmKyI6IithKyIpIHNlZTogaHR0cHM6Ly90aW55LmFtYXpvbi5jb20vMWpwcHp5a2k4IiwKdT17ZGFOYW1lOmEsZXZlbnRUeXBlOmYsZXZlbnRzOltdfTtjLmVhY2gocSxmdW5jdGlvbihhKXtiLmV4ZWN1dGUoZnVuY3Rpb24oKXthPWguZnJvbShhKS5jb2xsZWN0KHYpLmNvbGxlY3QoeSkuY29sbGVjdCh3KS5kdW1wKCk7dS5ldmVudHMucHVzaCh7YXRmOmEuaXNBVEYseHBhdGg6YS54cGF0aCxzZWxlY3RvcjphLmNzc1NlbGVjdG9yLGZlYXR1cmU6YS5mZWF0dXJlLGRhdGE6YS5kYURhdGEsZXZlbnRMYXRlbmN5OmEuZXZlbnRMYXRlbmN5LGhhbmRsZXJMYXRlbmN5Omx9KX0pfSk7Yi5leGVjdXRlKGZ1bmN0aW9uKCl7bS5sb2dFcnJvcihudWxsLHgsIkVSUk9SIixKU09OJiZKU09OLnN0cmluZ2lmeT9KU09OLnN0cmluZ2lmeSh1KToiIil9KX1jYXRjaChwKXt9fWZ1bmN0aW9uIHQoYSl7cmV0dXJuInVua25vd24iIT09dHlwZW9mIGEudHlwZX1mdW5jdGlvbiByKGEpe3JldHVybiBnLmV2ZW50LmZpeChhKX1mdW5jdGlvbiBhKGEpe3JldHVybi0xIT09Yy5pbmRleE9mQXJyYXkoZCwKYS50eXBlKX1mdW5jdGlvbiBxKGEpe3JldHVybiBhLnRhcmdldCE9PWRvY3VtZW50fWZ1bmN0aW9uIGYoYSl7cmV0dXJue2V2ZW50VHlwZTphLnR5cGV9fWZ1bmN0aW9uIGwoYSl7YT1nKGEudGFyZ2V0KS5jbG9zZXN0KCJbZGF0YS1hY3Rpb25dIikuZ2V0KDApO3JldHVybiB2b2lkIDA9PT1hP251bGw6YX1mdW5jdGlvbiB4KGEpe3JldHVybntkYU5hbWU6YS5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIil9fWZ1bmN0aW9uIHUoYSl7dmFyIGY9YS5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIik7cmV0dXJue2RhRGF0YTphLmdldEF0dHJpYnV0ZSgiZGF0YS0iK2YpfHwiIn19ZnVuY3Rpb24gdihhKXtyZXR1cm57aXNBVEY6Yy5pc0FURihhKX19ZnVuY3Rpb24geShhKXtyZXR1cm57eHBhdGg6Yy54cGF0aChhKSxjc3NTZWxlY3RvcjpjLmNzc1NlbGVjdG9yKGEpfX1mdW5jdGlvbiB3KGEpe3ZhciBmO2lmKGE9ZyhhKS5jbG9zZXN0KEIpLmdldCgwKSlmPWEuZ2V0QXR0cmlidXRlKEQpLApmfHwoYT1hLmlkKSYmYS5sZW5ndGg+QS5sZW5ndGgmJmEuaW5kZXhPZihBKT09PWEubGVuZ3RoLUEubGVuZ3RoJiYoZj1hLnNsaWNlKDAsYS5sZW5ndGgtQS5sZW5ndGgpKTtyZXR1cm57ZmVhdHVyZTpmfHwiIn19ZnVuY3Rpb24gRihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm57ZXZlbnRMYXRlbmN5OmF9fX12YXIgej17fSxCPSJbaWQkXHgzZF9mZWF0dXJlX2Rpdl0sLmZlYXR1cmUiLEQ9ImRhdGEtZmVhdHVyZS1uYW1lIixBPSJfZmVhdHVyZV9kaXYiLEg9bi51ZV90MHx8bi5hUGFnZVN0YXJ0fHxEYXRlLm5vdygpO3JldHVybntoYW5kbGU6ZnVuY3Rpb24oYyxiKXtpZigwIT09ZC5sZW5ndGgpezI+YXJndW1lbnRzLmxlbmd0aCYmKGI9RGF0ZS5ub3coKS1IKTt2YXIgZT0obmV3IGgoYykpLmZpbHRlcih0KS50cmFuc2Zvcm0ocikuZmlsdGVyKGEpLmZpbHRlcihxKS5jb2xsZWN0KGYpLmNvbGxlY3QoRihiKSkudHJhbnNmb3JtKGwpLmNvbGxlY3QoeCkuY29sbGVjdCh1KS5kdW1wKCk7CmlmKGUpe3ZhciBwPWUuZGFOYW1lKyI6IitlLmV2ZW50VHlwZTtwIGluIHp8fCh6W3BdPVtdKTt6W3BdLnB1c2goZSl9fX0sbm90aWZ5OmZ1bmN0aW9uKGEsZil7cChhLGYsRGF0ZS5ub3coKS1IKX19fSk7bS53aGVuKCJhLXV0aWwiLCJhLWNsYXNzIikucmVnaXN0ZXIoInBydjphLWV2ZW50LWNvbnRleHQiLGZ1bmN0aW9uKGQsZyl7dmFyIGs9Zy5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihjLGgpe3RoaXMuc3ViamVjdD1jO3RoaXMuY29sbGVjdGVkPWh8fHt9fSx0cmFuc2Zvcm06ZnVuY3Rpb24oYyl7aWYobnVsbD09PXRoaXMuc3ViamVjdClyZXR1cm4gdGhpczt2YXIgaDt0cnl7aD1jKHRoaXMuc3ViamVjdCl9Y2F0Y2goYil7cmV0dXJuIHRoaXMuc3ViamVjdD1udWxsLHRoaXN9dGhpcy5zdWJqZWN0PWg7cmV0dXJuIHRoaXN9LGZpbHRlcjpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0oZnVuY3Rpb24oaCl7cmV0dXJuIGMoaCk/aDpudWxsfSl9LGNvbGxlY3Q6ZnVuY3Rpb24oYyl7dmFyIGg9CnRoaXM7cmV0dXJuIHRoaXMudHJhbnNmb3JtKGZ1bmN0aW9uKGIpe3RyeXt2YXIgZT1jKGIpO2guY29sbGVjdGVkPWQuZXh0ZW5kKGguY29sbGVjdGVkLGUpfWNhdGNoKHApe31yZXR1cm4gYn0pfSxkdW1wOmZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuc3ViamVjdClyZXR1cm4gbnVsbDt0aGlzLmNvbGxlY3RlZC5fc3ViamVjdD10aGlzLnN1YmplY3Q7cmV0dXJuIHRoaXMuY29sbGVjdGVkfX0pO2suZnJvbT1mdW5jdGlvbihjKXtyZXR1cm4gbmV3IGsoYy5fc3ViamVjdCxjKX07cmV0dXJuIGt9KTsidXNlIHN0cmljdCI7bS5yZWdpc3RlcigicHJpdjphLXZpc2liaWxpdHkiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZChkKXtmb3IodmFyIGs9WyJoaWRkZW4iLCJ3ZWJraXRIaWRkZW4iLCJtb3pIaWRkZW4iLCJtc0hpZGRlbiIsIm9IaWRkZW4iXSxjPTA7YzxrLmxlbmd0aDtjKz0xKWlmKGtbY11pbiBkKXJldHVybiBrW2NdfXJldHVybiBmdW5jdGlvbihnKXt2YXIgaz1kKGcpO3JldHVybiBrPwpmdW5jdGlvbigpe3JldHVybiBnW2tdfTpmdW5jdGlvbigpe3JldHVybiExfX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLWJhc2UiLCJwcml2OmEtdmlzaWJpbGl0eSIpLnJlZ2lzdGVyKCJhLXV0aWwiLGZ1bmN0aW9uKGQsZyl7ZnVuY3Rpb24gayhhKXtpZigiIiE9PWEuaWQpcmV0dXJuJy8vKltAaWRceDNkIicrYS5pZCsnIl0nO2lmKGE9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpcmV0dXJuIi9odG1sIjt2YXIgcT1jKGEpLnBhcmVudCgpLmZpbmQoIiBceDNlICIrYS50YWdOYW1lKS5pbmRleChhKTtpZigtMT09PXEpdGhyb3ciY2FuIG5vdCBldmFsdWF0ZSB4cGF0aCBvZiBlbGVtZW50IGAiK2EudGFnTmFtZSsoYS5pZD8iIyIrYS5pZDoiIikrImAiO3JldHVybiBrKGEucGFyZW50Tm9kZSkrIi8iK2EudGFnTmFtZSsiWyIrKHErMSkrIl0ifXZhciBjPWQuJCxoPURhdGUubm93LGI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsbCx4KXtpZihudWxsIT09YSlpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaCYmCmEuZm9yRWFjaD09PUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKWEuZm9yRWFjaChsLHgpO2Vsc2UgaWYoYS5sZW5ndGg9PT0rYS5sZW5ndGgpZm9yKHZhciB1PTAsYz1hLmxlbmd0aDt1PGMmJiEodSBpbiBhJiZsLmNhbGwoeCxhW3VdLHUsYSk9PT1xKTt1KyspO2Vsc2UgZm9yKHUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KHUpJiZsLmNhbGwoeCxhW3VdLHUsYSk9PT17fSlicmVha312YXIgcT17fTtyZXR1cm57ZWFjaDphLG1hcDpmdW5jdGlvbihmLGwscSl7dmFyIGM9W107aWYobnVsbD09PWYpcmV0dXJuIGM7aWYoQXJyYXkucHJvdG90eXBlLm1hcCYmZi5tYXA9PT1BcnJheS5wcm90b3R5cGUubWFwKXJldHVybiBmLm1hcChsLHEpO2EoZixmdW5jdGlvbihhLGYsYil7Y1tjLmxlbmd0aF09bC5jYWxsKHEsYSxmLGIpfSk7Zi5sZW5ndGg9PT0rZi5sZW5ndGgmJihjLmxlbmd0aD1mLmxlbmd0aCk7cmV0dXJuIGN9LHJlZHVjZTpmdW5jdGlvbihmLGwscSxjKXt2YXIgYj0yPGFyZ3VtZW50cy5sZW5ndGg7Cm51bGw9PT1mJiYoZj1bXSk7aWYoQXJyYXkucHJvdG90eXBlLnJlZHVjZSYmZi5yZWR1Y2U9PT1BcnJheS5wcm90b3R5cGUucmVkdWNlKXJldHVybiBiP2YucmVkdWNlKGwscSk6Zi5yZWR1Y2UobCk7YShmLGZ1bmN0aW9uKGEsZixlKXtiP3E9bC5jYWxsKGMscSxhLGYsZSk6KHE9YSxiPSEwKX0pO2J8fG0uZXJyb3IoIlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiLCJBLnV0aWwiLCJyZWR1Y2UiKTtyZXR1cm4gcX0sZmlsdGVyOmZ1bmN0aW9uKGYsbCxxKXt2YXIgYz1bXTtpZihudWxsPT09ZilyZXR1cm4gYztpZihBcnJheS5wcm90b3R5cGUuZmlsdGVyJiZmLmZpbHRlcj09PUFycmF5LnByb3RvdHlwZS5maWx0ZXIpcmV0dXJuIGYuZmlsdGVyKGwscXx8Zik7YShmLGZ1bmN0aW9uKGEsYixlKXtsLmNhbGwocXx8ZixhLGIsZSkmJmMucHVzaChhKX0pO3JldHVybiBjfSxyYW5nZTpmdW5jdGlvbihhLGwscSl7dm9pZCAwPT09bCYmKGw9YXx8MCxhPTApOwpxPXF8fDE7bD1NYXRoLm1heChNYXRoLmNlaWwoKGwtYSkvcSksMCk7Zm9yKHZhciBjPUFycmF5KGwpLGI9MDtiPGw7YisrLGErPXEpY1tiXT1hO3JldHVybiBjfSxicmVha2VyOnF9fSgpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsZil7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkobnVsbCxsKX0sZil9cmV0dXJue3Rocm90dGxlOmZ1bmN0aW9uKGEsZixsKXt2YXIgYyxiLGUscD1udWxsLGQ9MDtsPWx8fHt9O3ZhciBrPWZ1bmN0aW9uKCl7ZD0hMT09PWwubGVhZGluZz8wOmgoKTtwPW51bGw7ZT1hLmFwcGx5KGMsYik7Yz1iPW51bGx9O3JldHVybiBmdW5jdGlvbigpe3ZhciBnPWgoKTtkfHwhMSE9PWwubGVhZGluZ3x8KGQ9Zyk7dmFyIHI9Zi0oZy1kKTtjPXRoaXM7Yj1hcmd1bWVudHM7MD49cj8oY2xlYXJUaW1lb3V0KHApLHA9bnVsbCxkPWcsZT1hLmFwcGx5KGMsCmIpLGM9Yj1udWxsKTpwfHwhMT09PWwudHJhaWxpbmd8fChwPXNldFRpbWVvdXQoayxyKSk7cmV0dXJuIGV9fSxzZXF1ZW5jZTpmdW5jdGlvbigpe3ZhciBhPVtdLnNsaWNlLGY9YS5jYWxsKGFyZ3VtZW50cykucmV2ZXJzZSgpLGw9dGhpcztyZXR1cm4gYi5yZWR1Y2UoZixmdW5jdGlvbihmLGMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBiPWEuY2FsbChhcmd1bWVudHMpO2IucHVzaChmKTtjLmFwcGx5KGwsYil9fSxmdW5jdGlvbigpe30pfSxkZWJvdW5jZTpmdW5jdGlvbihhLGYsbCl7dmFyIGMsYixlLHAsZCxrPWZ1bmN0aW9uKCl7dmFyIGc9aCgpLXA7ZzxmP2M9c2V0VGltZW91dChrLGYtZyk6KGM9bnVsbCxsfHwoZD1hLmFwcGx5KGUsYiksZT1iPW51bGwpKX07cmV0dXJuIGZ1bmN0aW9uKCl7ZT10aGlzO2I9YXJndW1lbnRzO3A9aCgpO3ZhciBnPWwmJiFjO2N8fChjPXNldFRpbWVvdXQoayxmKSk7ZyYmKGQ9YS5hcHBseShlLGIpLGU9Yj1udWxsKTtyZXR1cm4gZH19LGRlbGF5OmEsCmFuaW1hdGlvbkZyYW1lRGVsYXk6ZnVuY3Rpb24oYyl7cmV0dXJuIGEoYywxNil9LGludGVydmFsOmZ1bmN0aW9uKGEsZil7cmV0dXJuIHNldEludGVydmFsKGEsZil9LG9uY2U6ZnVuY3Rpb24oYSl7dmFyIGY9ITEsbDtyZXR1cm4gZnVuY3Rpb24oKXtmfHwoZj0hMCxsPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtyZXR1cm4gbH19LHJlc3Q6ZnVuY3Rpb24oYSxmKXtpZihhKXt2YXIgbD1NYXRoLm1heCh2b2lkIDA9PT1mP2EubGVuZ3RoLTE6ZiwwKTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGY9YXJndW1lbnRzLGM9LTEsYj1NYXRoLm1heChmLmxlbmd0aC1sLDApLGU9QXJyYXkoYik7KytjPGI7KWVbY109ZltjK2xdO3N3aXRjaChsKXtjYXNlIDA6cmV0dXJuIGEuY2FsbCh0aGlzLGUpO2Nhc2UgMTpyZXR1cm4gYS5jYWxsKHRoaXMsZlswXSxlKTtjYXNlIDI6cmV0dXJuIGEuY2FsbCh0aGlzLGZbMF0sZlsxXSxlKX1iPUFycmF5KGwrMSk7Zm9yKGM9LTE7KytjPGw7KWJbY109ZltjXTsKYltsXT1lO3JldHVybiBhLmFwcGx5KHRoaXMsYil9fX0scGFyc2VGdW5jdGlvbk5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZT8iYW5vbnltb3VzIj09PWEubmFtZT8iIjphLm5hbWU6KGE9YS50b1N0cmluZygpLm1hdGNoKC9eZnVuY3Rpb25ccyooW15ccyhdKykvKSk/YVsxXToiIn19fSgpO3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShmLGMpe2Y9Znx8e307Yz1jfHx7fTt2YXIgbD17fSxiO2ZvcihiIGluIGYpZi5oYXNPd25Qcm9wZXJ0eShiKSYmKGxbYl09Im9iamVjdCI9PT10eXBlb2YgZltiXSYmZltiXT9hKGZbYl0sY1tiXSk6ZltiXSE9PWNbYl0pO2ZvcihiIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShiKSYmIWxbYl0mJihsW2JdPSJvYmplY3QiPT09dHlwZW9mIGNbYl0mJmNbYl0/YShjW2JdLGZbYl0pOmNbYl0hPT1mW2JdKTtyZXR1cm4gbH1mdW5jdGlvbiBiKGEsZil7dmFyIGw7aWYoYT09PWYpcmV0dXJuITA7aWYoYy5pc0FycmF5KGEpKXtpZighYy5pc0FycmF5KGYpfHwKYS5sZW5ndGghPT1mLmxlbmd0aClyZXR1cm4hMTtmb3IobD1hLmxlbmd0aDtsLS07KWlmKCFiKGFbbF0sZltsXSkpcmV0dXJuITE7cmV0dXJuITB9aWYoYy5pc1BsYWluT2JqZWN0KGEpKXtpZighYy5pc1BsYWluT2JqZWN0KGYpfHxjLmlzRW1wdHlPYmplY3QoYSkmJiFjLmlzRW1wdHlPYmplY3QoZikpcmV0dXJuITE7Zm9yKGwgaW4gYSlpZighYihhW2xdLGZbbF0pKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGYoYSl7aWYoISgiZnVuY3Rpb24iPT09dHlwZW9mIGF8fCJvYmplY3QiPT09dHlwZW9mIGEmJmEpKXJldHVybltdO2lmKE9iamVjdC5rZXlzKXJldHVybiBPYmplY3Qua2V5cyhhKTt2YXIgZj1bXSxjO2ZvcihjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmZi5wdXNoKGMpO3JldHVybiBmfWZ1bmN0aW9uIGwoYSxmLGMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGYse3ZhbHVlOmMsd3JpdGFibGU6ITF9KTtyZXR1cm4gY31mdW5jdGlvbiBlKGEsZixjKXthLmhhc093blByb3BlcnR5KGYpfHwKKGFbZl09Yyk7cmV0dXJuIGN9cmV0dXJue2tleXM6Zix2YWx1ZXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWYoYSksbD1BcnJheShjLmxlbmd0aCksYj0wO2I8Yy5sZW5ndGg7YisrKWxbYl09YVtjW2JdXTtyZXR1cm4gbH0sZXh0ZW5kOmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLnVuc2hpZnQuY2FsbChhcmd1bWVudHMsITApO3JldHVybiBjLmV4dGVuZC5hcHBseShjLGFyZ3VtZW50cyl9LG1peGluOmZ1bmN0aW9uKGEsZixjKXtpZihjKWZvcih2YXIgbD0wLGI9Yy5sZW5ndGg7bDxiO2wrKylhW2NbbF1dPWZbY1tsXV07ZWxzZSBmb3IobCBpbiBmKSJmdW5jdGlvbiI9PT10eXBlb2YgZltsXSYmKGFbbF09ZltsXSl9LGRpZmY6YSxlcXVhbHM6Yixjb3B5OmZ1bmN0aW9uKGEpe3JldHVybiBjLmlzQXJyYXkoYSk/Yy5leHRlbmQoITAsW10sYSk6Yy5pc1BsYWluT2JqZWN0KGEpP2MuZXh0ZW5kKCEwLHt9LGEpOmF9LGluZGV4T2ZBcnJheTpmdW5jdGlvbihhLGYsYyl7aWYoQXJyYXkucHJvdG90eXBlLmluZGV4T2YmJgphLmluZGV4T2Y9PT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gYS5pbmRleE9mKGYsYyk7YSYmYSBpbnN0YW5jZW9mIEFycmF5fHxtLmVycm9yKCJJbnZhbGlkIGFyciBwYXNzZWQgdG8gQS5pbmRleE9mQXJyYXk6ICIrYSwiQS51dGlsIiwiaW5kZXhPZkFycmF5Iik7Yz1wYXJzZUludChjLDEwKTtjPWlzTmFOKGMpPzA6YztpZighaXNGaW5pdGUoYykpcmV0dXJuLTE7Zm9yKHZhciBsPWEubGVuZ3RoO2M8bDtjKyspaWYoYVtjXT09PWYpcmV0dXJuIGM7cmV0dXJuLTF9LGlzQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheShhKToiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfSxpc0Zpbml0ZU51bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhJiYhaXNOYU4oYSkmJmlzRmluaXRlKGEpfSxvYmplY3RJc0VtcHR5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgZiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZikpcmV0dXJuITE7CnJldHVybiEwfSxjb25zdFByb3A6ImZ1bmN0aW9uIj09PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHk/bDplfX0oKSxwPWZ1bmN0aW9uKCl7dmFyIGE9eyJceDI2IjoiXHgyNmFtcDsiLCJceDNjIjoiXHgyNmx0OyIsIlx4M2UiOiJceDI2Z3Q7IiwnIic6Ilx4MjZxdW90OyIsIiciOiJceDI2IzM5OyIsIi8iOiJceDI2I3gyRjsifSxjPS9eXHMrLyxmPS9ccyskLyxsPW5ldyBSZWdFeHAoIlsiK2Uua2V5cyhhKS5qb2luKCIiKSsiXSIsImciKSxiPS8oWyEiIyQlJidcKFwpKissLi86Ozw9Pj9AXFtcXFxdXmB7fH1+XSkvZztyZXR1cm57dHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS50cmltP1N0cmluZy5wcm90b3R5cGUudHJpbS5jYWxsKGEpOmEucmVwbGFjZShjLCIiKS5yZXBsYWNlKGYsIiIpfSxjb250YWluczpmdW5jdGlvbihhLGYpe3JldHVybi0xIT09KCIiK2EpLmluZGV4T2YoZil9LGVzY2FwZUh0bWw6ZnVuY3Rpb24oZil7cmV0dXJuKCIiK2YpLnJlcGxhY2UobCwKZnVuY3Rpb24oZil7cmV0dXJuIGFbZl19KX0sZXNjYXBlSnF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnJlcGxhY2UoYiwiXFwkMSIpfX19KCksdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPXt9O2Zvcih2YXIgYT0oZG9jdW1lbnQuY29va2llfHwiIikuc3BsaXQoIjsiKSxsPWEubGVuZ3RoLTE7MDw9bDtsLS0pe3ZhciBiPWFbbF0uc3BsaXQoIlx4M2QiKSxlPXAudHJpbShiWzBdKTtpZihlKXt2YXIgaD1jLGI9Yi5zbGljZSgxKS5qb2luKCJceDNkIiksYj1wLnRyaW0oYik7L14iLy50ZXN0KGIpJiYoYj1iLnNsaWNlKDEsLTEpLnJlcGxhY2UoL1xcKC4pL2csIiQxIikpO2I9bi5kZWNvZGVVUklDb21wb25lbnQoYik7aFtlXT1ifX19dmFyIGM7cmV0dXJue2dldDpmdW5jdGlvbihmKXtjfHxhKCk7cmV0dXJuIGNbZl19LGdldEFsbDpmdW5jdGlvbigpe2N8fGEoKTtyZXR1cm4gZS5leHRlbmQoe30sYyl9LHJlZnJlc2g6ZnVuY3Rpb24oKXtjPW51bGx9fX0oKSwKcj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZha2VlbGVtZW50IiksYz17dHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIixNb3pUcmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIixXZWJraXRUcmFuc2l0aW9uOiJ3ZWJraXRUcmFuc2l0aW9uRW5kIn0sZj1udWxsO3JldHVybntnZXRUcmFuc2l0aW9uRW5kRXZlbnQ6ZnVuY3Rpb24oKXsvVUNCcm93c2VyLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZj1jLldlYmtpdFRyYW5zaXRpb24pO2lmKG51bGw9PT1mKWZvcih2YXIgYiBpbiBjKWlmKHZvaWQgMCE9PWEuc3R5bGVbYl0pe2Y9Y1tiXTticmVha31yZXR1cm4gZn19fSgpO2c9Zyhkb2N1bWVudCk7cmV0dXJue25vdzpoLGV4dGVuZDplLmV4dGVuZCxtaXhpbjplLm1peGluLGNvcHk6ZS5jb3B5LGNvbnN0UHJvcDplLmNvbnN0UHJvcCxkaWZmOmUuZGlmZixlcXVhbHM6ZS5lcXVhbHMsb2JqZWN0SXNFbXB0eTplLm9iamVjdElzRW1wdHksCmluZGV4T2ZBcnJheTplLmluZGV4T2ZBcnJheSxpc0FycmF5OmUuaXNBcnJheSxpc0Zpbml0ZU51bWJlcjplLmlzRmluaXRlTnVtYmVyLGtleXM6ZS5rZXlzLHZhbHVlczplLnZhbHVlcyx4cGF0aDprLGNzc1NlbGVjdG9yOmZ1bmN0aW9uKGEpe3ZhciBjPVthLnRhZ05hbWV8fCIiXTthLmNsYXNzTmFtZSYmYS5jbGFzc05hbWUudHJpbSYmYy5wdXNoKCIuIithLmNsYXNzTmFtZS50cmltKCkucmVwbGFjZSgvXHMrL2csIi4iKSk7YS5pZCYmYy5wdXNoKCIjIithLmlkKTtyZXR1cm4gYy5qb2luKCIiKX0scGFyc2VKU09OOmZ1bmN0aW9uKGEpe3JldHVybiBjLnBhcnNlSlNPTihhKX0sdGhyb3R0bGU6ZC50aHJvdHRsZSxzZXF1ZW5jZTpkLnNlcXVlbmNlLGRlYm91bmNlOmQuZGVib3VuY2UsZGVsYXk6ZC5kZWxheSxhbmltYXRpb25GcmFtZURlbGF5OmQuYW5pbWF0aW9uRnJhbWVEZWxheSxpbnRlcnZhbDpkLmludGVydmFsLG9uY2U6ZC5vbmNlLHJlc3Q6ZC5yZXN0LHRyaW06cC50cmltLApjb250YWluczpwLmNvbnRhaW5zLGVzY2FwZUh0bWw6cC5lc2NhcGVIdG1sLGVzY2FwZUpxdWVyeVNlbGVjdG9yOnAuZXNjYXBlSnF1ZXJ5U2VsZWN0b3IsbWFwOmIubWFwLHJlZHVjZTpiLnJlZHVjZSxmaWx0ZXI6Yi5maWx0ZXIscmFuZ2U6Yi5yYW5nZSxlYWNoOmIuZWFjaCxicmVha2VyOmIuYnJlYWtlcixvblNjcmVlbjpmdW5jdGlvbihhLGIpe2I9Im51bWJlciI9PT10eXBlb2YgYiYmIWlzTmFOKGIpJiZpc0Zpbml0ZShiKT9iOjEwMDt2YXIgZj1jKGEpO2lmKCFmLmlzKCI6dmlzaWJsZSIpKXJldHVybiExO3ZhciBsPWMobik7YT1sLnNjcm9sbFRvcCgpO3ZhciBsPW4uaW5uZXJIZWlnaHQ/bi5pbm5lckhlaWdodDpsLmhlaWdodCgpLGU9YStsO2EtPWI7ZSs9YjtiPWYub2Zmc2V0KCkudG9wO3ZhciBmPWYuaGVpZ2h0KCkscD1iK2Y7cmV0dXJuIGI+PWEmJmI8ZXx8cD5hJiZwPD1lfHxmPmwmJmI8PWEmJnA+PWV9LGlzQVRGOmZ1bmN0aW9uKGEsYil7Yj0ibnVtYmVyIj09PXR5cGVvZiBiJiYKIWlzTmFOKGIpJiZpc0Zpbml0ZShiKT9iOjEwMDt2YXIgZj1jKG4pO2I9KG4uaW5uZXJIZWlnaHQ/bi5pbm5lckhlaWdodDpmLmhlaWdodCgpKStiO2E9YyhhKS5vZmZzZXQoKS50b3A7cmV0dXJuIDA8PWEmJmE8Yn0sc2V0Q3NzSW1wb3J0YW50OmZ1bmN0aW9uKGEsYyxiKXthPWEuanF1ZXJ5P2FbMF06YTsidW5kZWZpbmVkIiE9PXR5cGVvZiBhJiYoYT1hLnN0eWxlLGEuY3NzVGV4dD1hLmNzc1RleHQucmVwbGFjZShuZXcgUmVnRXhwKGMrIlxccyo6XFxzKlsuXjtdKihcXHMqOyk/IiwiZ21pIiksIiIpLGEuY3NzVGV4dCs9YysiOiAiK2IrIiAhaW1wb3J0YW50OyIpfSxnZXRUcmFuc2l0aW9uRW5kRXZlbnQ6ci5nZXRUcmFuc2l0aW9uRW5kRXZlbnQsY29va2llczp0LHdpZGVzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4gMDxjKCJodG1sLmEtd3MiKS5sZW5ndGh9LGlzUGFnZUhpZGRlbjpnLHBhcnNlRnVuY3Rpb25OYW1lOmQucGFyc2VGdW5jdGlvbk5hbWV9fSk7InVzZSBzdHJpY3QiOwptLndoZW4oInAtZGV0ZWN0IiwiYS11dGlsIikucmVnaXN0ZXIoImEtZGV0ZWN0IixmdW5jdGlvbihkLGcpe3ZhciBrO3RyeXtrPW5hdmlnYXRvci51c2VyQWdlbnR9Y2F0Y2gocCl7az0iIn12YXIgYz1nLmNvcHkoZCksaD1mdW5jdGlvbigpe3ZhciBjPS8oPzpBbmRyb2lkXHMrfFdpbmRvd3Nob3AuKkFuZHJvaWRcL3xBbmRyb2lkXC8pKFxkK1wuXGQrKD86XC5cZCspKikvLmV4ZWMoayk7cmV0dXJuIGMmJmNbMV19LGI9L1RyaWRlbnQvLnRlc3QoayksZT17fTtnLmVhY2goe2lzQW1hem9uQXBwOmZ1bmN0aW9uKCl7cmV0dXJuLyhXaW5kb3dzaG9wfEFtYXpvbnxBbWF6b25cLmNvbSlcLy8udGVzdChnLmNvb2tpZXMuZ2V0KCJhbXpuLWFwcC1pZCIpKX0saXNHZW41QXBwOmZ1bmN0aW9uKCl7cmV0dXJuL1dpbmRvd3Nob3AuKig/OktGT1R8S0ZUSHxLRkpXQXxLRkpXSXxLRlRUKS8udGVzdChrKX0sYW5kcm9pZFZlcnNpb246ZnVuY3Rpb24oKXtyZXR1cm4gaCgpfSxpc0FuZHJvaWRLaXRrYXRQbHVzOmZ1bmN0aW9uKCl7dmFyIGM9CmgoKTtyZXR1cm4gYyYmbnVsbCE9PWMubWF0Y2goLyheNFwuWzQtOV18Xls1LTldKS8pfSxpc0Nocm9tZTpmdW5jdGlvbigpe3JldHVybi9DaHJvbWUvLnRlc3Qoayl9LGNocm9tZVZlcnNpb246ZnVuY3Rpb24oKXt2YXIgYz0vQ2hyb21lXC8oXGQrXC5cZCsoPzpcLlxkKykqKS8uZXhlYyhrKTtpZihjWzFdKXJldHVybiBjWzFdfSxpc1VDQnJvd3NlcjpmdW5jdGlvbigpe3JldHVybi9VQ0Jyb3dzZXIvLnRlc3Qoayl9LGlzU2FmYXJpOmZ1bmN0aW9uKCl7dmFyIGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO3JldHVybiEoIk1vekFwcGVhcmFuY2UiaW4gYykmJiJ3ZWJraXRBcHBlYXJhbmNlImluIGMmJi9eQXBwbGUvLnRlc3QobmF2aWdhdG9yLnZlbmRvcil9LGlzQW5kcm9pZFN0b2NrR3Vlc3M6ZnVuY3Rpb24oKXt2YXIgYj0hMTtjLmNhcGFiaWxpdGllcy5hbmRyb2lkJiYhL0Nocm9tZXxPcGVyYXxGaXJlZm94fFVDQnJvd3Nlci8udGVzdChrKSYmKGI9L0FwcGxlV2ViS2l0XC8oXGQrXC5cZCspLy5leGVjKGspLApiPWJbMV0mJiI1MzUiPmJbMV0pO3JldHVybiBifSxpc0ZpcmVmb3g6ZnVuY3Rpb24oKXtyZXR1cm4vRmlyZWZveC8udGVzdChrKX0saXNBbmRyb2lkOmZ1bmN0aW9uKCl7cmV0dXJuIGMuY2FwYWJpbGl0aWVzLmFuZHJvaWR9LGlzT2xkQW5kcm9pZDpmdW5jdGlvbigpe3JldHVybi9BbmRyb2lkXHNbMTJdLy50ZXN0KGspfSxpc0lFOmZ1bmN0aW9uKCl7cmV0dXJuIGJ9LGlzSUUxMDpmdW5jdGlvbigpe3JldHVybiBiJiYib25tc3BvaW50ZXJ1cCJpbiBkb2N1bWVudCYmISgib25wb2ludGVydXAiaW4gZG9jdW1lbnQpfSxpc0lFMTBQbHVzOmZ1bmN0aW9uKCl7cmV0dXJuIGImJigib25wb2ludGVydXAiaW4gZG9jdW1lbnR8fCJvbm1zcG9pbnRlcnVwImluIGRvY3VtZW50KX0saXNJRTExUGx1czpmdW5jdGlvbigpe3JldHVybiBiJiYib25wb2ludGVydXAiaW4gZG9jdW1lbnR9LGlzaU9TODpmdW5jdGlvbigpe3JldHVybiBjLmNhcGFiaWxpdGllcy5pb3MmJi9WZXJzaW9uXC84XC4vLnRlc3Qoayl9LAppc0lFVG91Y2hDYXBhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXMmJi9Ub3VjaDsvLnRlc3Qoayl9LGlzTWV0cm9JRUd1ZXNzOmZ1bmN0aW9uKCl7dmFyIGI9ITA7dHJ5e2I9bmV3IEFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIil9Y2F0Y2goZSl7Yj0hMX1yZXR1cm4gYy5jYXBhYmlsaXRpZXMuaXNJRTEwUGx1cyYmIWMuY2FwYWJpbGl0aWVzLm1vYmlsZSYmIWJ9LHBvaW50ZXJQcmVmaXg6ZnVuY3Rpb24oKXtyZXR1cm4ib25tc3BvaW50ZXJ1cCJpbiBkb2N1bWVudHx8Im9ucG9pbnRlcnVwImluIGRvY3VtZW50PyJvbnBvaW50ZXJ1cCJpbiBkb2N1bWVudD8icG9pbnRlciI6Ik1TUG9pbnRlciI6ITF9LGFjdGlvbk1vZGU6ZnVuY3Rpb24oKXt2YXIgYj1jLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4O3JldHVybiBiP2I6Yy5jYXBhYmlsaXRpZXMudG91Y2g/InRvdWNoIjoibW91c2UifX0sZnVuY3Rpb24oYixlKXt2YXIgaD1jLmNhcGFiaWxpdGllcywKYTt0cnl7YT1iKCl9Y2F0Y2gocSl7YT0hMX1oW2VdPWF9KTtnLmVhY2goe3N0YXJ0Onttb3VzZToiZG93biIsdG91Y2g6InN0YXJ0Iixwb2ludGVyOiJkb3duIixNU1BvaW50ZXI6IkRvd24ifSxlbmQ6e21vdXNlOiJ1cCIsdG91Y2g6ImVuZCIscG9pbnRlcjoidXAiLE1TUG9pbnRlcjoiVXAifSxtb3ZlOnttb3VzZToibW92ZSIsdG91Y2g6Im1vdmUiLHBvaW50ZXI6Im1vdmUiLE1TUG9pbnRlcjoiTW92ZSJ9LGVudGVyOnttb3VzZToiZW50ZXIiLHRvdWNoOiJlbnRlciIscG9pbnRlcjoiZW50ZXIifSxsZWF2ZTp7bW91c2U6ImxlYXZlIix0b3VjaDoibGVhdmUiLHBvaW50ZXI6ImxlYXZlIn0sY2FuY2VsOnt0b3VjaDoiY2FuY2VsIixwb2ludGVyOiJjYW5jZWwiLE1TUG9pbnRlcjoiQ2FuY2VsIn0sb3Zlcjp7bW91c2U6Im92ZXIiLHBvaW50ZXI6Im92ZXIiLE1TUG9pbnRlcjoiT3ZlciJ9LG91dDp7bW91c2U6Im91dCIscG9pbnRlcjoib3V0IixNU1BvaW50ZXI6Ik91dCJ9fSxmdW5jdGlvbihiLApoKXt2YXIgZD1jLmNhcGFiaWxpdGllcy5hY3Rpb25Nb2RlLGE9InN0cmluZyI9PT10eXBlb2YgYj9iOmJbZF07ZVtoXT1hP2QrYTp2b2lkIDA9PT1iLm1vdXNlPyIiOiJtb3VzZSIrYi5tb3VzZX0pO2MuYWN0aW9uPWU7ZD17fTsicG9pbnRlciI9PT1jLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4PyhkLnRvdWNoPSJ0b3VjaCIsZC5wZW49InBlbiIsZC5tb3VzZT0ibW91c2UiLGQudW5rbm93bj0iIik6Ik1TUG9pbnRlciI9PT1jLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4JiYoZC50b3VjaD0yLGQucGVuPTMsZC5tb3VzZT00KTtjLnBvaW50ZXJUeXBlPWQ7cmV0dXJuIGN9KTsidXNlIHN0cmljdCI7bS53aGVuKCJwcnY6YS1ndWFyZCIpLnJlZ2lzdGVyKCJhLWRlZmVyIixmdW5jdGlvbihkKXtmdW5jdGlvbiBnKGIpe3ZhciBlPTAsZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZyhiKX0sMCk7aWYoMD09PWIubGVuZ3RoKWNsZWFyVGltZW91dChkKSxjPSExO2Vsc2V7dmFyIGs9RGF0ZS5ub3coKTsKYi5zaGlmdCgpLmNhbGwoKTtoKz1EYXRlLm5vdygpLWs7NTA8aCYmKGU9NTAsaD0wKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZyhiKX0sZSk7Y2xlYXJUaW1lb3V0KGQpfX12YXIgaz1bXSxjPSExLGg9MDtyZXR1cm57ZGVmZXI6ZnVuY3Rpb24oYil7ay5wdXNoKGQuZm4odGhpcyxiKSk7Y3x8KGM9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2coayl9LDApKX0scGF1c2VEZWZlcnJlZDpmdW5jdGlvbigpe30sZXhlY3V0ZURlZmVycmVkOmZ1bmN0aW9uKCl7fX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJqUXVlcnkiLCJhLXV0aWwiLCJwLWRldGVjdCIsImEtZXZlbnQtcmV2aXNlZC1oYW5kbGluZyIpLnJlZ2lzdGVyKCJhLWV2ZW50cyIsZnVuY3Rpb24oZCxnLGssYyl7ZnVuY3Rpb24gaChhLGMpeyExIT09YyYmci5tYWtlVG9waWNUaW1lU2xpY2VkKGEpO3BbYV09ITA7ci5zdWJzY3JpYmUoYSxmdW5jdGlvbigpe20ucmVnaXN0ZXIoYSxmdW5jdGlvbigpe3ZhciBhPW4uYVBhZ2VTdGFydHx8Cmcubm93KCk7cmV0dXJue3RpbWU6Zy5ub3coKS1hfX0pfSk7ci5wdWJsaXNoKGEpO3IudW5zdWJzY3JpYmUoYSl9ZnVuY3Rpb24gYigpe3AuYmVmb3JlTG9hZCYmcC5sb2FkfHwoaCgiYmVmb3JlTG9hZCIpLGgoImxvYWQiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aCgiYmVmb3JlQWZ0ZXJMb2FkIik7aCgiYWZ0ZXJMb2FkIil9LDE1MDApKX1mdW5jdGlvbiBlKGEsYyl7dmFyIGI9dGhpcy5vbjt0aGlzLm9uPWZ1bmN0aW9uKCl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0aGlzLm9uLl9ndWFyZD1hO3RoaXMub24uX2xvZ0Vycm9yPWM7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKHRoaXMub25bZV09YltlXSk7dGhpcy5jb25zdHJ1Y3Rvcj12b2lkIDB9dmFyIHA9e30sdD1kKG4pLHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2Zvcih2YXIgYyxmPVtdLGw9MCxlPXIubGVuZ3RoO2w8ZTtsKyspYz1yW2xdLmlkLGIhPT1jJiZmLnB1c2gocltsXSk7cj0KZn1mdW5jdGlvbiBiKGEsYyl7Yz1bYywiRXZlbnQgZXhlY3V0aW9uIGZhaWxlZCBmb3IgZXZlbnQgIithLnRvcGljLCJGQVRBTCJdO2EubG9nRXJyb3I/YS5sb2dFcnJvci5hcHBseShhLGMpOm0ubG9nRXJyb3IuYXBwbHkobSxjKX1mdW5jdGlvbiBlKGMpe2Zvcih2YXIgcT1zZXRUaW1lb3V0KGUsMCksaD1nLm5vdygpLGQ7dm9pZCAwIT09KGQ9ci5zaGlmdCgpKTspdHJ5e2lmKCExPT09ZC5mbi5hcHBseShuLGQuYXJncykmJihjbGVhclRpbWVvdXQocSksYShkLmlkKSksITA9PT1jJiY1MDw9Zy5ub3coKS1oKXtjbGVhclRpbWVvdXQocSk7Zy5kZWxheShlLDE1KTtyZXR1cm59fWNhdGNoKGspe2IoZCxrKTtyZXR1cm59Y2xlYXJUaW1lb3V0KHEpO3A9ITF9ZnVuY3Rpb24gaCgpe2Zvcih2YXIgYz1nLm5vdygpLGU7dm9pZCAwIT09KGU9ci5zaGlmdCgpKTspdHJ5e2lmKCExPT09ZS5mbi5hcHBseShuLGUuYXJncykmJmEoZS5pZCksci5sZW5ndGgmJjUwPD1nLm5vdygpLWMpe2cuZGVsYXkoaCwKMTUpO3JldHVybn19Y2F0Y2gocSl7YihlLHEpfXA9ITF9ZnVuY3Rpb24gZChhKXtmb3IodmFyIGM7dm9pZCAwIT09KGM9YS5zaGlmdCgpKTspdHJ5e2lmKCExPT09Yy5mbi5hcHBseShuLGMuYXJncykpYnJlYWt9Y2F0Y2goZil7YihjLGYpfX12YXIgcT17fSxrPTAscD0hMSxyPVtdO3JldHVybntwdWJsaXNoOmZ1bmN0aW9uKGEpe3ZhciBiPXFbYV07aWYoYil7dmFyIGY9Yi5pc1RpbWVTbGljZWQsbD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZz1rKyssdD1bXSxuPWZ1bmN0aW9uKGMsYil7Yi5wdXNoKHt0b3BpYzphLGlkOmcsZm46Yy5ndWFyZD9jLmd1YXJkKGMuZm4pOmMuZm4sYXJnczpsLGxvZ0Vycm9yOmMubG9nRXJyb3J9KX07aWYoZilmb3IodmFyIG07dm9pZCAwIT09KG09Yi5zaGlmdCgpKTspbihtLHIpO2Vsc2V7bT0wO2Zvcih2YXIgRz1iLmxlbmd0aDttPEc7bSsrKW4oYlttXSxjP3Q6cil9Yz9mP3B8fChwPSEwLGgoKSk6ZCh0KTpwfHwocD0hMCwKZShmKSl9fSxzdWJzY3JpYmU6ZnVuY3Rpb24oYSxjLGIpe3FbYV18fChxW2FdPVtdKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpcmV0dXJuIHFbYV0udW5zaGlmdCh7Zm46Yyxsb2dFcnJvcjpiJiZiLmxvZ0Vycm9yLGd1YXJkOmImJmIuZ3VhcmR9KSx7ZXZlbnQ6YSxjYWxsYmFjazpjfX0sdW5zdWJzY3JpYmU6ZnVuY3Rpb24oYSxjKXt2YXIgYjtmb3IoYT1hLnNwbGl0KCIgIik7dm9pZCAwIT09KGI9YS5wb3AoKSk7KWlmKHFbYl0paWYoYyl7Yj1xW2JdO2Zvcih2YXIgZj0wLGw9Yi5sZW5ndGg7ZjxsO2YrKyliW2ZdJiZiW2ZdLmZuPT09YyYmYi5zcGxpY2UoZi0tLDEpfWVsc2UgcVtiXT1bXX0saXNTdWJzY3JpYmVkOmZ1bmN0aW9uKGEpe3JldHVybiBhIGluIHEmJjA8cVthXS5sZW5ndGh9LG1ha2VUb3BpY1RpbWVTbGljZWQ6ZnVuY3Rpb24oYSl7cVthXXx8KHFbYV09W10pO3FbYV0uaXNUaW1lU2xpY2VkPSEwfX19KCksYT1mdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZj0KYS5zcGxpdCgiICIpLGU9W10scT1jLGQ9dGhpcz97bG9nRXJyb3I6dGhpcy5fbG9nRXJyb3IsZ3VhcmQ6dGhpcy5fZ3VhcmR9Ont9O2ZvcighMD09PWImJihxPWZ1bmN0aW9uKCl7Yy5hcHBseShuLGFyZ3VtZW50cyk7ci51bnN1YnNjcmliZShhLHEpfSk7dm9pZCAwIT09KGI9Zi5wb3AoKSk7KXBbYl0/KHIuc3Vic2NyaWJlKGIsYyxkKSxyLnB1Ymxpc2goYiksci51bnN1YnNjcmliZShiKSk6ZS5wdXNoKHIuc3Vic2NyaWJlKGIscSxkKS5ldmVudCk7cmV0dXJue2V2ZW50OmUuam9pbigiICIpLGNhbGxiYWNrOnF9fTtnLmVhY2goInJlYWR5IGxvYWQgdW5sb2FkIGFmdGVyTG9hZCBzY3JvbGwgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIHpvb20iLnNwbGl0KCIgIiksZnVuY3Rpb24oYixjKXthW2JdPWZ1bmN0aW9uKCl7YS5hcHBseSh0aGlzLFtiXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19KTtyZXR1cm4gYX0oKSxxPWcub25jZShmdW5jdGlvbigpe2sucmVzcG9uc2l2ZUdyaWRFbmFibGVkKCkmJgprLnRvZ2dsZVJlc3BvbnNpdmVHcmlkKCEwKTtoKCJiZWZvcmVSZWFkeSIpO2goInJlYWR5Iik7aCgiYWZ0ZXJSZWFkeSIpOyJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlJiZiKCl9KTtkKGRvY3VtZW50KS5yZWFkeShxKTttLndoZW4oImEtYm9keUJlZ2luIikuZXhlY3V0ZShmdW5jdGlvbigpe2goImJvZHlCZWdpbiIpfSk7bS53aGVuKCJhLWRvbXJlYWR5IikuZXhlY3V0ZShxKTt0LmxvYWQoYik7dC51bmxvYWQoZnVuY3Rpb24oKXtoKCJ1bmxvYWQiLCExKX0pO2UucHJvdG90eXBlPXtpc0xpc3RlbmluZzpyLmlzU3Vic2NyaWJlZCxvbjphLG9uZTpmdW5jdGlvbihiLGMpe3ZhciBlPWIuc3BsaXQoIiAiKTtpZigxPGUubGVuZ3RoKW0uZXJyb3IoIkEub25lIG9ubHkgYWNjZXB0cyBhIHNpbmdsZSBldmVudCBuYW1lLCBidXQgd2FzIHByb3ZpZGVkIHdpdGg6ICIrZS5sZW5ndGgrIiwgKCIrYisiKSIsIkEuZXZlbnRzIiwib25lIik7ZWxzZSByZXR1cm4gYShiLGMsITApfSwKb2ZmOmZ1bmN0aW9uKGEsYil7dmFyIGM7Im9iamVjdCI9PT10eXBlb2YgYT8oYz1hLmV2ZW50LGE9YS5jYWxsYmFjayk6KGM9YSxhPWIpO3JldHVybiByLnVuc3Vic2NyaWJlKGMsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyLnB1Ymxpc2guYXBwbHkobixhcmd1bWVudHMpfSxldmVudHM6e2RlZmF1bHRzOntpbnB1dDoiY2hhbmdlIixzZWxlY3Q6ImNoYW5nZSIsYToiY2xpY2siLGJ1dHRvbjoiY2xpY2siLGZvcm06InN1Ym1pdCJ9fX07ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTtyZXR1cm4gZS5wcm90b3R5cGV9KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLXV0aWwiLCJhLWV2ZW50cyIpLnJlZ2lzdGVyKCJhLXByZWZpeCIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKGIpe3JldHVybiBiLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLSguKS9nLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGMudG9VcHBlckNhc2UoKX0pfXZhciBjPXt0cmFuc2l0aW9uZW5kOm51bGx9LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsCmI9e30sZT1bIm8iLCJtcyIsIm1veiIsIndlYmtpdCJdO2cub24oImJlZm9yZVJlYWR5IixmdW5jdGlvbigpe2lmKG4uYWRkRXZlbnRMaXN0ZW5lcil7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1mdW5jdGlvbihiKXtjLnRyYW5zaXRpb25lbmQ9Yi50eXBlO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0VHJhbnNpdGlvbkVuZCIsZSwhMSk7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixlLCExKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm90cmFuc2l0aW9uZW5kIixlLCExKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm9UcmFuc2l0aW9uRW5kIixlLCExKX07Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDt6LWluZGV4Oi0xO3RyYW5zaXRpb246dG9wIDFtcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjp0b3AgMW1zIGVhc2U7LW1vei10cmFuc2l0aW9uOnRvcCAxbXMgZWFzZTstby10cmFuc2l0aW9uOnRvcCAxbXMgZWFzZTsiKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixlLCExKTtiLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdFRyYW5zaXRpb25FbmQiLGUsITEpO2IuYWRkRXZlbnRMaXN0ZW5lcigib3RyYW5zaXRpb25lbmQiLGUsITEpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigib1RyYW5zaXRpb25FbmQiLGUsITEpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7ZC5kZWxheShmdW5jdGlvbigpe2Iuc3R5bGUudG9wPSIxMDBweCI7ZC5kZWxheShmdW5jdGlvbigpe2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtiPWU9bnVsbDtkLmVhY2goYyxmdW5jdGlvbihiKXt9KX0sMTAwKX0sMCl9fSk7cmV0dXJue3ByZWZpeGVzOntnZXRTdHlsZTpmdW5jdGlvbihjKXtpZighYltjXSl7dmFyIGQ9ayhjKTtpZihkIGluIGgpYltjXT1kO2Vsc2UgZm9yKHZhciBkPWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKSxnPWUubGVuZ3RoO2ctLTspe3ZhciBhPWVbZ10rZDthIGluIGgmJgooYltjXT1hKX19cmV0dXJuIGJbY119LGdldEV2ZW50OmZ1bmN0aW9uKGIpe3JldHVybiBiP2NbYi50b0xvd2VyQ2FzZSgpXTp2b2lkIDB9fX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLWJhc2UiLCJhLXV0aWwiLCJhLWV2ZW50cyIsImEtZXZlbnQtYW5hbHl0aWNzIiwiYS10aW1pbmctYW5hbHl0aWNzIiwicHJ2OmEtZGVjbGFyYXRpdmUtYW5hbHl0aWNzIiwicC1yZWNvcmRlci1zdG9wIikucmVnaXN0ZXIoImEtZGVjbGFyYXRpdmUiLGZ1bmN0aW9uKGQsZyxrLGMsaCxiLGUpe2Z1bmN0aW9uIHAoYSl7dmFyIGI9dChhLmN1cnJlbnRUYXJnZXQpLGY9dChhLnRhcmdldCk7aWYoInN1Ym1pdCI9PT1hLnR5cGUpe3ZhciBsPWYuY2xvc2VzdCgiZm9ybSIpO2wubGVuZ3RoJiYoZj1sKX1pZihsPWIuZGF0YSgiYWN0aW9uIikpbD1sLnNwbGl0KCIgIiksZy5lYWNoKGwsZnVuY3Rpb24obCl7dmFyIGU9cltsXXx8e30sZD1iLmRhdGEobCksaD1hLnR5cGUsZz17JHRhcmdldDpmLCRjdXJyZW50VGFyZ2V0OmIsCnRhcmdldFRhZzpmLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpLHR5cGU6aCxhY3Rpb246bCxkYXRhOmQsJGV2ZW50OmEsJGRlY2xhcmF0aXZlUGFyZW50OmJ9O2w9ImE6ZGVjbGFyYXRpdmU6IitsO2g9bCsiOiIraDtrLnRyaWdnZXIobCxnKTtrLnRyaWdnZXIoaCxnKTtrLmlzTGlzdGVuaW5nKGgpfHxjLmhhbmRsZShhKTtnPSExO2Q/Zz0hIWQuYWxsb3dMaW5rRGVmYXVsdDplJiYoZz0hIWUuYWxsb3dMaW5rRGVmYXVsdCk7ImNsaWNrIiE9PWEudHlwZXx8Zz9lPSExOihlPWYuY2xvc2VzdCgiYSIpLGU9ZS5sZW5ndGgmJigiIyI9PT1lWzBdLmhyZWZ8fGEuY3VycmVudFRhcmdldD09PWVbMF18fGUucGFyZW50KCIuYS1kZWNsYXJhdGl2ZSIpLmxlbmd0aCkpO2UmJmEucHJldmVudERlZmF1bHQoKX0pfXZhciB0PWQuJCxyPXt9O2UoKTt0KGRvY3VtZW50KS5kZWxlZ2F0ZSgiLmEtZGVjbGFyYXRpdmUiLCJibHVyIGNsaWNrIGRibGNsaWNrIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbW91c2Vkb3duIG1vdXNldXAgbW91c2VlbnRlciBtb3VzZWxlYXZlIG1vdXNlbW92ZSBjaGFuZ2Ugc3VibWl0IHRvdWNoc3RhcnQgdG91Y2hlbmQgdG91Y2htb3ZlIHRvdWNoY2FuY2VsIGtleWRvd24ga2V5dXAga2V5cHJlc3MgTVNQb2ludGVyRG93biBwb2ludGVyZG93biBNU1BvaW50ZXJVcCBwb2ludGVydXAgTVNQb2ludGVyTW92ZSBwb2ludGVybW92ZSBNU1BvaW50ZXJDYW5jZWwgcG9pbnRlcmNhbmNlbCBNU1BvaW50ZXJPdmVyIHBvaW50ZXJlbnRlciBNU1BvaW50ZXJPdXQgcG9pbnRlcmxlYXZlIiwKcCkuZGVsZWdhdGUoIi5hLWdlc3R1cmUiLCJ0YXAgc3dpcGUgc3dpcGUtaG9yaXpvbnRhbCBzd2lwZS12ZXJ0aWNhbCBwYW4taG9yaXpvbnRhbCBwYW4tdmVydGljYWwgZG91YmxlVGFwIixwKTtkPWZ1bmN0aW9uKCl7dmFyIGEsZSxmLGw7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMjphPWFyZ3VtZW50c1swXTtsPWFyZ3VtZW50c1sxXTticmVhaztjYXNlIDM6YT1hcmd1bWVudHNbMF07ZT1hcmd1bWVudHNbMV07bD1hcmd1bWVudHNbMl07YnJlYWs7Y2FzZSA0OmE9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLGY9YXJndW1lbnRzWzJdLGw9YXJndW1lbnRzWzNdfWlmKGEpeyJzdHJpbmciPT09dHlwZW9mIGEmJihhPWcudHJpbShhKS5zcGxpdCgiICIpKTt2YXIgZD10aGlzO2cuZWFjaChhLGZ1bmN0aW9uKGEpe3ZhciBoPSJhOmRlY2xhcmF0aXZlOiIrYTtyW2FdPWZ8fHt9O2U/KGU9InN0cmluZyI9PT10eXBlb2YgZT9nLnRyaW0oZSkuc3BsaXQoIiAiKTplLGcuZWFjaChlLApmdW5jdGlvbihmKXtrLm9uLmNhbGwoZCxoKyI6IitmLGwpO2Mubm90aWZ5KGEsZik7Yi5ub3RpZnkoYSxmKX0pKTprLm9uLmNhbGwoZCxoLGwpfSl9fTtkLmNyZWF0ZT1mdW5jdGlvbihhLGIsYyl7dmFyIGw9YS5qcXVlcnkmJmEubGVuZ3RoP2E6dChhKTtpZihsLmxlbmd0aCYmYil7dmFyIGU9bC5kYXRhKCJhY3Rpb24iKTtsLmRhdGEoImFjdGlvbiIsZT9lKyIgIitiOmIpLmRhdGEoYixjP2M6e30pO2wuYWRkQ2xhc3MoImEtZGVjbGFyYXRpdmUiKX1yZXR1cm4gYX07ZC5yZW1vdmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmpxdWVyeSYmYS5sZW5ndGg/YTp0KGEpO2lmKCFjLmxlbmd0aClyZXR1cm4gYTt2YXIgbD1jLmRhdGEoImFjdGlvbiIpO2lmKCFsKXJldHVybiBhO3ZhciBlPWwuc3BsaXQoIiAiKTtiPyhiPWIuc3BsaXQoIiAiKSxnLmVhY2goYixmdW5jdGlvbihhKXt2YXIgYj1nLmluZGV4T2ZBcnJheShlLGEpOzA8PWImJihlLnNwbGljZShiLDEpLGMuZGF0YShhLG51bGwpKX0pKToKKGcuZWFjaChlLGZ1bmN0aW9uKGEpe2MuZGF0YShhLG51bGwpfSksZT1bXSk7ZS5sZW5ndGg/Yy5kYXRhKCJhY3Rpb24iLGUuam9pbigiICIpKTpjLmRhdGEoImFjdGlvbiIsbnVsbCkucmVtb3ZlQ2xhc3MoImEtZGVjbGFyYXRpdmUiKTtyZXR1cm4gYX07aC5zdG9wV2lkZ2V0TG9nZ2luZygiZGVjbGFyYXRpdmUiKTtyZXR1cm57ZGVjbGFyYXRpdmU6ZH19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLXV0aWwiLCJqUXVlcnkiLCJhLWRlY2xhcmF0aXZlIikucmVnaXN0ZXIoImEtZHJhZ2dhYmxlIixmdW5jdGlvbihkLGcsayl7dmFyIGMsaD17X21heFpJbmRleDowLF9pc0luaXQ6ITEsX2RyYWdnYWJsZXM6W10sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9pc0luaXR8fCh0aGlzLl9pc0luaXQ9ITAsdGhpcy5fbWF4WkluZGV4PTk3NSl9LGNyZWF0ZTpmdW5jdGlvbihiKXt0aGlzLl9pbml0KCk7Yi5femltSW5kZXh8fChiLl96aW1JbmRleD05NzUsdGhpcy5fbWF4WkluZGV4Kz0xLHRoaXMuX2RyYWdnYWJsZXMucHVzaChiKSk7CnRoaXMuYWNxdWlyZUZvY3VzKGIpfSxhY3F1aXJlRm9jdXM6ZnVuY3Rpb24oYil7Yi5jc3MoInpJbmRleCIsdGhpcy5fbWF4WkluZGV4KTtjLmNzcygiekluZGV4Iix0aGlzLl9tYXhaSW5kZXgtMSk7Zm9yKHZhciBhPTA7YTx0aGlzLl9kcmFnZ2FibGVzLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuX2RyYWdnYWJsZXNbYV07ZVswXSE9PWJbMF0mJmUuX3ppbUluZGV4PmIuX3ppbUluZGV4JiYoZS5femltSW5kZXgtPWUuX3ppbUluZGV4PnRoaXMuX21heFpJbmRleC0xPzI6MSxlLmNzcygiekluZGV4IixlLl96aW1JbmRleCkpfWIuX3ppbUluZGV4PXRoaXMuX21heFpJbmRleH19LGI9ZnVuY3Rpb24oYil7dmFyIGE9Yi4kZXZlbnQ7ZC5jb250YWlucygidG91Y2hzdGFydCB0b3VjaGVuZCB0b3VjaG1vdmUiLGIudHlwZSkmJihhPWEub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKTtyZXR1cm57eDphLmNsaWVudFgseTphLmNsaWVudFl9fSxlPWZ1bmN0aW9uKGMpe3ZhciBhPWMuZGF0YS4kZHJhZ2dhYmxlLAplPWEuZGF0YSgiYS1kcmFnZ2FibGVzIiksZj1iKGMpO2UuaXNNb3VzZURvd24mJihhLmNzcyh7bGVmdDpmLngtZS5jbGlja09mZnNldC54LHRvcDpmLnktZS5jbGlja09mZnNldC55fSksYy4kZXZlbnQucHJldmVudERlZmF1bHQoKSl9LHA9ZnVuY3Rpb24oZSl7dmFyIGE9ZS4kZXZlbnQudGFyZ2V0fHxlLiRldmVudC5zcmNFbGVtZW50LGQ9ZS5kYXRhLiRkcmFnZ2FibGUsZj1kLmRhdGEoImEtZHJhZ2dhYmxlcyIpO2guYWNxdWlyZUZvY3VzKGQpO2E9ZyhhKS5jbG9zZXN0KGYuJGhhbmRsZSxkKTtmLmlzTW91c2VEb3duPTA8YS5sZW5ndGg7Zi5pc01vdXNlRG93biYmKGMmJmMucmVtb3ZlQ2xhc3MoImFvay1oaWRkZW4iKSxhPWIoZSksZi5jbGlja09mZnNldD17eDphLngtcGFyc2VGbG9hdChkLmNzcygibGVmdCIpKSx5OmEueS1wYXJzZUZsb2F0KGQuY3NzKCJ0b3AiKSl9LGQuZGF0YSgiYS1kcmFnZ2FibGVzIixmKSxjLmRhdGEoImEtZHJhZ2dhYmxlcyIsZiksZS4kZXZlbnQucHJldmVudERlZmF1bHQoKSl9LAp0PWZ1bmN0aW9uKGIpe2I9Yi5kYXRhLiRkcmFnZ2FibGU7dmFyIGE9Yi5kYXRhKCJhLWRyYWdnYWJsZXMiKTthLmlzTW91c2VEb3duPSExO2IuZGF0YSgiYS1kcmFnZ2FibGVzIixhKTtjJiZjLmFkZENsYXNzKCJhb2staGlkZGVuIil9O3JldHVybntkcmFnZ2FibGU6ZnVuY3Rpb24oYixhKXtiPWIuanF1ZXJ5P2I6ZyhiKTthPXtpc01vdXNlRG93bjohMSwkZHJhZ2dhYmxlOmIsJGhhbmRsZTphJiZhLmhhbmRsZT9hLmhhbmRsZTpifTthLiRoYW5kbGU9YS4kaGFuZGxlLmpxdWVyeT9hLiRoYW5kbGU6ZyhhLmhhbmRsZSk7YS4kaGFuZGxlLmNzcygiY3Vyc29yIiwibW92ZSIpO2N8fChjPWcoIlx4M2NkaXZceDNlIix7aWQ6ImEtZHJhZ2dhYmxlcy1tb3VzZWRvd24tbGF5ZXIiLCJjbGFzcyI6ImFvay1oaWRkZW4ifSkuYXBwZW5kVG8oImJvZHkiKSxrLmRlY2xhcmF0aXZlLmNyZWF0ZShjLCJhLWRyYWdnYWJsZXMiLGEpKTtoLmNyZWF0ZShhLiRkcmFnZ2FibGUpO2suZGVjbGFyYXRpdmUuY3JlYXRlKGEuJGRyYWdnYWJsZSwKImEtZHJhZ2dhYmxlcyIsYSk7ay5kZWNsYXJhdGl2ZSgiYS1kcmFnZ2FibGVzIixbIm1vdXNlZG93biIsInRvdWNoc3RhcnQiXSxwKTtrLmRlY2xhcmF0aXZlKCJhLWRyYWdnYWJsZXMiLFsibW91c2V1cCIsInRvdWNoZW5kIl0sdCk7ay5kZWNsYXJhdGl2ZSgiYS1kcmFnZ2FibGVzIixbIm1vdXNlbW92ZSIsInRvdWNobW92ZSJdLGUpfX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLWJhc2UiLCJhLXV0aWwiLCJhLWV2ZW50cyIsImEtZGVjbGFyYXRpdmUiLCJhLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLXN0YXRlIixmdW5jdGlvbihkLGcsayxjLGgpe2Z1bmN0aW9uIGIoYSxiLGMsZSl7dmFyIGQ9IShhIGluIHIpO2lmKG51bGw9PT1ifHx0LmlzQXJyYXkoYil8fHQuaXNQbGFpbk9iamVjdChiKSl7dmFyIHA9Zy5jb3B5KHJbYV0pO3AmJmImJiFlJiYodC5pc0FycmF5KHApfHx0LmlzUGxhaW5PYmplY3QocCkpP2cuZXh0ZW5kKHJbYV0sYik6clthXT1nLmNvcHkoYik7Yj1nLmRpZmYocCwKclthXSk7ZT1nLmNvcHkoclthXSk7Y3x8ay50cmlnZ2VyKCJhOnN0YXRlOnVwZGF0ZToiK2EsZSxiLHApO2QmJm0uZGVjbGFyZShoLmNvbnN0YW50cy5QQUdFU1RBVEVfTE9BREVEX01PRFVMRV9QUkVGSVgrYSxlKTtyZXR1cm4gZX1tLmVycm9yKCJJbnZhbGlkIHZhbHVlIHBhc3NlZCB0byBBLnN0YXRlIHdpdGggYSBuYW1lc3BhY2Ugb2YgIithKyIuICBWYWx1ZTogIitiLCJBLnN0YXRlIiwidXBkYXRlTmFtZXNwYWNlIil9ZnVuY3Rpb24gZShhLGIsYyl7aWYoMT09PWIubGVuZ3RoKXJldHVybiBhW2Iuc2hpZnQoKV09YyxhO2FbYi5zaGlmdCgpXT1lKHt9LGIsYyk7cmV0dXJuIGF9ZnVuY3Rpb24gcCgpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksYz0wLGU9YS5sZW5ndGg7YzxlO2MrKylpZighdC5kYXRhKGFbY10sImEtZXZhbCIpKXt2YXIgbD10KGFbY10pLGQ9bC5hdHRyKCJkYXRhLWEtc3RhdGUiKTtpZihkJiYoZD1nLnBhcnNlSlNPTihkKSwKZC5rZXkpKXt2YXIgaDt0cnl7aD1nLnBhcnNlSlNPTihsLmh0bWwoKSl9Y2F0Y2goayl7bS5sb2dFcnJvcihrLCJTdGF0ZSBwYXJzaW5nIGZhaWxlZCBmb3Igc3RhdGUgIitkLmtleSwiRVJST1IiKTtjb250aW51ZX10LmRhdGEoYVtjXSwiYS1ldmFsIiwhMCk7KGw9cltkLmtleV0pJiZnLmV4dGVuZChoLGwpO2IoZC5rZXksaCl9fX12YXIgdD1kLiQscj17fTtjLmRlY2xhcmF0aXZlKCJhLXN0YXRlIixmdW5jdGlvbihhKXt2YXIgYz1hLiR0YXJnZXQsZj1hLmRhdGEua2V5LGw9YS5kYXRhW2EudHlwZV07bHx8ay5ldmVudHMuZGVmYXVsdHNbYS50YXJnZXRUYWddIT09YS50eXBlfHwobD1jLmF0dHIoIm5hbWUiKSk7bCYmZiYmKGMuaXMoInNlbGVjdCIpJiYoYz1jLmZpbmQoIjpzZWxlY3RlZCIpKSx2b2lkIDAhPT10eXBlb2YgYy52YWwoKSYmInN0cmluZyI9PT10eXBlb2YgbCYmKGE9Yy52YWwoKSxjLmlzKCJpbnB1dFt0eXBlXHgzZGNoZWNrYm94XSIpJiYhYy5wcm9wKCJjaGVja2VkIikmJgooYT1udWxsKSxsPWUoe30sbC5zcGxpdCgiLiIpLGEpKSxiKGYsbCkpfSk7ZD1mdW5jdGlvbihhLGMsZSl7cmV0dXJuIHZvaWQgMD09PWM/Zy5jb3B5KHJbYV0pOmIoYSxjLCEhZSl9O2QuYmluZD1mdW5jdGlvbihhLGIpe2sub24oImE6c3RhdGU6dXBkYXRlOiIrYSxiKX07ZC5yZXBsYWNlPWZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gYihhLGMsISFlLCEwKX07ay5vbigiYmVmb3JlUmVhZHkiLHApO2QucGFyc2U9cDtyZXR1cm57c3RhdGU6ZH19KTsidXNlIHN0cmljdCI7bS53aGVuKCJwcnY6YS1ndWFyZCIsImEtYmFzZSIsImEtdXRpbCIsImEtZXZlbnRzIiwiYS1kZWNsYXJhdGl2ZSIsImEtc3RhdGUiKS5yZWdpc3RlcigiYS1hamF4IixmdW5jdGlvbihkLGcsayxjLGgsYil7ZnVuY3Rpb24gZShhLGIpe2lmKCFhKXJldHVybiIiO3ZhciBjPSJzdHJpbmciPT09dHlwZW9mIGE7aWYoInN0cmluZyI9PT1iKXJldHVybiBjP2E6IiI7aWYoImpzb24iPT09Yil7aWYoYylyZXR1cm4gYTt0cnl7cmV0dXJuIEpTT04mJgpKU09OLnN0cmluZ2lmeT9KU09OLnN0cmluZ2lmeShhKToiIn1jYXRjaChlKXttLmxvZ0Vycm9yKGUsIkFKQVggUE9TVCBmYWlsZWQgdG8gY29udmVydCBKU09OIG9iamVjdCB0byBzdHJpbmciKX1yZXR1cm4iIn1yZXR1cm4gYz8iIjp0LnBhcmFtKGEpfWZ1bmN0aW9uIHAoYixjKXtiJiYwIT09Yi5sZW5ndGgmJigic3RyaW5nIj09PXR5cGVvZiBiJiYiIj09PWsudHJpbShiKT9jJiZjKGIpOihiWzBdaW5zdGFuY2VvZiBBcnJheXx8KGI9W2JdKSxrLmVhY2goYixmdW5jdGlvbihlKXt2YXIgZj1hW2VbMF1dO2Y/Zi5hcHBseShuLGUpOigoZj1jKXx8bS5lcnJvcigiVGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhlIHN0cmVhbWluZyBhamF4IGNvbW1hbmQ6ICIrYlswXSwiQS5hamF4IiwiY2h1bmtIYW5kbGVyIiksZihlKSl9KSkpfXZhciB0PWcuJCxyPWZ1bmN0aW9uKCl7bi5YTUxIdHRwUmVxdWVzdHx8KG4uWE1MSHR0cFJlcXVlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9KTsKdmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7MDxiLmxlbmd0aD9iLnBvcCgpLnNlbmQoKTpjLS19dmFyIGI9W10sYz0wLGU9MCxmPTA7cmV0dXJue2FkZDpmdW5jdGlvbihhKXs0PmM/KGEuc2VuZCgpLGMrKyk6KGIucHVzaChhKSxlKyssYi5sZW5ndGg+ZiYmKGY9Yi5sZW5ndGgpLChhPW4udWUpJiZhLmNvdW50JiYoYS5jb3VudCgiYXVpOmFqYXg6cXVldWVkIixlKSxhLmNvdW50KCJhdWk6YWpheDptYXhRdWV1ZWQiLGYpKSl9LGNvbXBsZXRlOmEsYWJvcnQ6ZnVuY3Rpb24oYyl7ay5lYWNoKGIsZnVuY3Rpb24oYSxlKXtpZihhPT09YylyZXR1cm4gYi5zcGxpY2UoZSwxKSxrLmJyZWFrZXJ9KTthKCl9fX0oKSxiPWZ1bmN0aW9uKCl7fSxlPWZ1bmN0aW9uKGIpe3ZhciBlPWIuaHR0cCxmPSExLGQ9ITE7c3dpdGNoKGUucmVhZHlTdGF0ZSl7Y2FzZSA0OmQ9ITA7YnJlYWs7Y2FzZSAzOmY9ITB9dmFyIGg9MjAwPT09ZS5zdGF0dXN8fDMwND09PWUuc3RhdHVzLGc9Yi5yZXNwb25zZVBvc2l0aW9uOwppZihmfHxkJiZoKXt2YXIgcD1lLnJlc3BvbnNlVGV4dDtpZihnPHAubGVuZ3RoKXt2YXIgZz1wLnN1YnN0cmluZyhnLHAubGVuZ3RoKSxwPWcuc3BsaXQoIlx4MjZceDI2XHgyNiIpLHE9Zy5sYXN0SW5kZXhPZigiXHgyNlx4MjZceDI2Iik7aWYoLTE9PT1xJiZmKXJldHVybjtxPGcubGVuZ3RoLTMmJmYmJnAucG9wKCk7ay5lYWNoKHAsZnVuY3Rpb24oYSxjKXt2YXIgZTtpZigiIiE9PWsudHJpbShhKSl0cnl7ZT1rLnBhcnNlSlNPTihhKX1jYXRjaChmKXttLmxvZ0Vycm9yKGYsIkludmFsaWQgc3RyZWFtaW5nIGFqYXggSlNPTiByZXNwb25zZTogIithKX1lbHNlIGU9YTtiLmNhbGxiYWNrcy5jaHVuayhlKX0pO2IucmVzcG9uc2VQb3NpdGlvbis9cX19ZCYmKGNsZWFySW50ZXJ2YWwoYi5wb2xsVGltZXIpLGNsZWFyVGltZW91dChiLnRpbWVvdXRUaW1lciksYS5jb21wbGV0ZSgpLGg/Yi5jYWxsYmFja3Muc3VjY2VzcyhudWxsLGUuc3RhdHVzVGV4dCxiKTpiLmNhbGxiYWNrcy5mYWlsdXJlKGIsCmUuc3RhdHVzVGV4dCxlLnN0YXR1c1RleHQpLGMudHJpZ2dlcigiYTpwYWdlVXBkYXRlIiksYy50cmlnZ2VyKCJhOmFqYXg6Y29tcGxldGUiKSl9LGY9ZnVuY3Rpb24oYil7dmFyIGU9Yi5odHRwO2lmKDQ9PT1lLnJlYWR5U3RhdGUpe2NsZWFySW50ZXJ2YWwoYi5wb2xsVGltZXIpO2NsZWFyVGltZW91dChiLnRpbWVvdXRUaW1lcik7YS5jb21wbGV0ZSgpO3ZhciBmPWUucmVzcG9uc2VUZXh0O3RyeXt2YXIgZD1rLnBhcnNlSlNPTihmKTtkJiYoZj1kKX1jYXRjaChoKXt9MjAwIT09ZS5zdGF0dXMmJjMwNCE9PWUuc3RhdHVzP2IuY2FsbGJhY2tzLmZhaWx1cmUoYixlLnN0YXR1c1RleHQsZS5zdGF0dXNUZXh0KTpiLmNhbGxiYWNrcy5zdWNjZXNzKGYsZS5zdGF0dXNUZXh0LGIpO2MudHJpZ2dlcigiYTphamF4OmNvbXBsZXRlIil9fTtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGIpezQ+Yi5odHRwLnJlYWR5U3RhdGUmJihjbGVhckludGVydmFsKGIucG9sbFRpbWVyKSxiLmNhbGxiYWNrcy5mYWlsdXJlKGIsCiJSZXF1ZXN0IFRpbWVvdXQiLCJSZXF1ZXN0IFRpbWVvdXQiKSxhLmNvbXBsZXRlKCkpfWZ1bmN0aW9uIGQoYSxiLGMpe2M9Y3x8e307Yz1rLmV4dGVuZCh7fSxnLmFsbCxnW2JdLGMpO2suZWFjaChjLGZ1bmN0aW9uKGIsYyl7KGJ8fCIiPT09YikmJmEuc2V0UmVxdWVzdEhlYWRlcihjLGIpfSk7cmV0dXJuIGF9ZnVuY3Rpb24gaChiLGMsZSxmLGcsayxwLHEseCxyKXt2YXIgdD1iLmh0dHA7dC5vcGVuKGMsZSk7ZCh0LGMseCk7Yi50aW1lb3V0PWY7Yi5jYWxsYmFja3MuY2h1bms9Z3x8Yi5jYWxsYmFja3MuY2h1bms7Yi5jYWxsYmFja3Muc3VjY2Vzcz1rfHxiLmNhbGxiYWNrcy5zdWNjZXNzO2IuY2FsbGJhY2tzLmZhaWx1cmU9cHx8Yi5jYWxsYmFja3MuZmFpbHVyZTtiLmNhbGxiYWNrcy5hYm9ydD1xfHxiLmNhbGxiYWNrcy5hYm9ydDtyJiYodC53aXRoQ3JlZGVudGlhbHM9ITApO2EuYWRkKGIpO3JldHVybnthYm9ydDpmdW5jdGlvbigpe2IuYWJvcnQoKX19fXZhciBnPXthbGw6eyJYLVJlcXVlc3RlZC1XaXRoIjoiWE1MSHR0cFJlcXVlc3QifSwKZ2V0OntBY2NlcHQ6InRleHQvaHRtbCwqLyoifSxwb3N0OntBY2NlcHQ6InRleHQvaHRtbCwqLyoiLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifX0scD1mdW5jdGlvbigpe3ZhciBhPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLnBvbGxUaW1lcj1udWxsO3RoaXMuaHR0cD1hO3RoaXMucmVzcG9uc2VQb3NpdGlvbj0wO3RoaXMuYnVmZmVyPSIiO3RoaXMuY2FsbGJhY2tzPXtzdWNjZXNzOmIsZmFpbHVyZTpiLGNodW5rOmIsYWJvcnQ6Yn19O3AucHJvdG90eXBlPXtzZW5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmh0dHAuc2VuZChhLnBhcmFtcyk7YS5wb2xsVGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtpZigyPD1hLmh0dHAucmVhZHlTdGF0ZSYmInVua25vd24iIT09dHlwZW9mIGEuaHR0cC5yZXNwb25zZVRleHQpe3ZhciBiPWEuaHR0cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIiksYj1iP2IudG9Mb3dlckNhc2UoKToKIiI7KC0xIT09Yi5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uLWFtYXpvbnVpLXN0cmVhbWluZyIpfHwtMSE9PWIuaW5kZXhPZigiYXBwbGljYXRpb24vYW1hem9udWktc3RyZWFtaW5nLWpzb24iKT9lOmYpKGEpfX0sMjUpO2EudGltZW91dD0idW5kZWZpbmVkIj09PXR5cGVvZiBhLnRpbWVvdXQ/MkU0OmEudGltZW91dDthLnRpbWVvdXRUaW1lcj1rLmRlbGF5KGMsYS50aW1lb3V0LGEpfSxnZXQ6ZnVuY3Rpb24oYSxiLGMsZSxmLGwsZCxnLGspe2lmKGIpe3ZhciBwPWEuaW5kZXhPZigiPyIpLHE9YS5jaGFyQXQoYS5sZW5ndGgtMSk7LTE8cD8iPyIhPT1xJiYiXHgyNiIhPT1xJiYoYSs9Ilx4MjYiKTphKz0iPyI7YSs9Yn1yZXR1cm4gaCh0aGlzLCJnZXQiLGEsYyxlLGYsbCxkLGcsayl9LGFib3J0OmZ1bmN0aW9uKCl7dGhpcy5odHRwJiZ0aGlzLmh0dHAuYWJvcnQoKTtjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpO2EuYWJvcnQodGhpcyk7CnRoaXMuY2FsbGJhY2tzLmFib3J0KHRoaXMpfSxwb3N0OmZ1bmN0aW9uKGEsYixjLGUsZixsLGQsZyxrKXt0aGlzLnBhcmFtcz1iO3JldHVybiBoKHRoaXMsInBvc3QiLGEsYyxlLGYsbCxkLGcsayl9fTtyZXR1cm4gcH0oKX0oKSxhPXt1cGRhdGU6ZnVuY3Rpb24oYSxiLGMpe3QoYikuaHRtbChjKX0sYXBwZW5kOmZ1bmN0aW9uKGEsYixjKXthPXQoYik7YS5odG1sKGEuaHRtbCgpK2MpfSxwcmVwZW5kOmZ1bmN0aW9uKGEsYixjKXthPXQoYik7YS5odG1sKGMrYS5odG1sKCkpfSxzdGF0ZTpmdW5jdGlvbihhLGMsZSl7Yi5zdGF0ZShjLGUpfSxzY3JpcHQ6ZnVuY3Rpb24oYSxiKXtldmFsKGIpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7dmFyIGU7ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Yy50cmlnZ2VyLmFwcGx5KHZvaWQgMCxlKX19LHE9eyJhLWFqYXgtdXBkYXRlIjpmdW5jdGlvbihhKXt2YXIgYj1uZXcgcixjPWZ1bmN0aW9uKCl7dmFyIGE9bi51ZTsKYSYmYS50YWcmJihhLnRhZygiYXVpIiksYS50YWcoImF1aTphamF4IikpfSxlPWEuYWJvcnQsZj10KGEuaW5kaWNhdG9yKTtmLnNob3coKTt2YXIgZD0ic3RyaW5nIj09PXR5cGVvZiBhLm1ldGhvZCYmInBvc3QiPT09YS5tZXRob2QudG9Mb3dlckNhc2UoKT8icG9zdCI6ImdldCI7ImdldCI9PT1kJiYhMT09PWEuY2FjaGUmJihhLnBhcmFtcys9WyIiPT09YS5wYXJhbXM/IiI6Ilx4MjYiLCJfXHgzZCIsay5ub3coKV0uam9pbigiIikpO3JldHVybiBiW2RdKGEudXJsLGEucGFyYW1zLGEudGltZW91dCxmdW5jdGlvbihiKXtjKCk7cChiLGEuY2h1bmspfSxmdW5jdGlvbigpe2YuaGlkZSgpO2MoKTthLnN1Y2Nlc3MmJmEuc3VjY2Vzcy5hcHBseShuLGFyZ3VtZW50cyl9LGZ1bmN0aW9uKCl7Zi5oaWRlKCk7YygpO2EuZmFpbHVyZSYmYS5mYWlsdXJlLmFwcGx5KG4sYXJndW1lbnRzKX0sZSxhLmhlYWRlcnMsYS53aXRoQ3JlZGVudGlhbHMpfX07aC5kZWNsYXJhdGl2ZSgiYS1hamF4LXVwZGF0ZSIsCmZ1bmN0aW9uKGEpe3ZhciBiPWEuJHRhcmdldCxmPWEuYWN0aW9uLGQ9YS5kYXRhO2lmKGR8fGMuZXZlbnRzLmRlZmF1bHRzW2EudGFyZ2V0VGFnXT09PWEudHlwZSlpZigib2JqZWN0IiE9PXR5cGVvZiBkfHxkW2EudHlwZV0pe3ZhciBkPWR8fHt9LGg9ZC51cmx8fGIuYXR0cigiaHJlZiIpfHxiLmF0dHIoImFjdGlvbiIpLGc9ZShkLnBhcmFtcyxkLnBhcmFtc0Zvcm1hdCksaz1iLmF0dHIoIm1ldGhvZCIpfHxkLm1ldGhvZCxwPWQuaW5kaWNhdG9yLGQ9ZC50aW1lb3V0O2h8fG0uZXJyb3IoIk5vIGFqYXggdXJsIHByb3ZpZGVkLiIsIkEuYWpheCIsImRlY2xhcmF0aXZlSGFuZGxlciIpOyJmb3JtIj09PWEudGFyZ2V0VGFnJiZhLnR5cGU9PT1jLmV2ZW50cy5kZWZhdWx0cy5mb3JtJiYoYj1iLnNlcmlhbGl6ZSgpLGcrPWIpO2EuJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIHFbZl0oe3VybDpoLHBhcmFtczpnLG1ldGhvZDprLGluZGljYXRvcjpwLG9wZXJhdGlvbjpmLHRpbWVvdXQ6ZH0pfX0pOwp2YXIgZj1mdW5jdGlvbihhLGIpe2I9Ynx8e307dmFyIGM9Yi5oZWFkZXJzfHx7fTt2b2lkIDAhPT1iLmFjY2VwdHMmJihjLkFjY2VwdD1iLmFjY2VwdHMpO3ZvaWQgMCE9PWIuY29udGVudFR5cGUmJihjWyJDb250ZW50LVR5cGUiXT1iLmNvbnRlbnRUeXBlKTt2YXIgZj1lKGIucGFyYW1zLGIucGFyYW1zRm9ybWF0KTtyZXR1cm4gcVsiYS1hamF4LXVwZGF0ZSJdKGQub2JqKHRoaXMse3VybDphLGNhY2hlOmIuY2FjaGUscGFyYW1zOmYsbWV0aG9kOmIubWV0aG9kLGNodW5rOmIuY2h1bmssc3VjY2VzczpiLnN1Y2Nlc3MsZmFpbHVyZTpiLmZhaWx1cmV8fGIuZXJyb3IsYWJvcnQ6Yi5hYm9ydCxpbmRpY2F0b3I6Yi5pbmRpY2F0b3IsdGltZW91dDpiLnRpbWVvdXQsaGVhZGVyczpjLHdpdGhDcmVkZW50aWFsczohIWIud2l0aENyZWRlbnRpYWxzfSkpfTtyZXR1cm57YWpheDpmLGdldDpmdW5jdGlvbihhLGIpe2I9Ynx8e307Yi5tZXRob2Q9ImdldCI7cmV0dXJuIGYuY2FsbCh0aGlzLGEsCmIpfSxwb3N0OmZ1bmN0aW9uKGEsYil7Yj1ifHx7fTtiLm1ldGhvZD0icG9zdCI7cmV0dXJuIGYuY2FsbCh0aGlzLGEsYil9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtYmFzZSIsImEtdXRpbCIsInAtZGV0ZWN0IiwiYS1wcmVmaXgiKS5yZWdpc3RlcigiYS1hbmltYXRlIixmdW5jdGlvbihkLGcsayxjKXtmdW5jdGlvbiBoKGEsYixlKXthPWEuanF1ZXJ5P2FbMF06YTtiPWMucHJlZml4ZXMuZ2V0U3R5bGUoYik7YS5zdHlsZVtiXT1lfWZ1bmN0aW9uIGIoYSl7dmFyIGI9IiIsYz1rLmNhcGFiaWxpdGllcy50cmFuc2Zvcm0zZDt2b2lkIDAhPT1hLnRvcCYmdm9pZCAwIT09YS5sZWZ0PyhiPSJ0cmFuc2xhdGUiLGMmJihiKz0iM2QiKSxiKz0iKCIrYS5sZWZ0KyIsICIrYS50b3AsYyYmKGIrPSIsIDAiKSxiKz0iKSIpOih2b2lkIDAhPT1hLnRvcD9iPSJ0cmFuc2xhdGVZKCIrYS50b3ArIikiOnZvaWQgMCE9PWEubGVmdCYmKGI9InRyYW5zbGF0ZVgoIithLmxlZnQrIikiKSxjJiYoYis9CiIgdHJhbnNsYXRlWigwKSIpKTt2b2lkIDAhPT1hLnNjYWxlJiYoYis9IiBzY2FsZSgiK2Euc2NhbGUrIikiKTtyZXR1cm4gYn1mdW5jdGlvbiBlKGEpe3ZhciBiPXt9LGM9ITE7Zy5lYWNoKHQsZnVuY3Rpb24oZSl7ZSBpbiBhJiYoYz0hMCxiW2VdPWFbZV0sZGVsZXRlIGFbZV0pfSk7cmV0dXJuIGM/YjpudWxsfWZ1bmN0aW9uIHAoYSxiLGMpe2suY2FwYWJpbGl0aWVzLnRyYW5zZm9ybT8oInN0cmluZyI9PT10eXBlb2YgYyYmKGM9cGFyc2VJbnQoYywxMCkpLGcuaXNGaW5pdGVOdW1iZXIoYyl8fChjPTApLGE9cGFyc2VJbnQoYS5jc3MoYiksMTApLGcuaXNGaW5pdGVOdW1iZXIoYSl8fChhPTApLGM9Yy1hKyJweCIpOmcuaXNGaW5pdGVOdW1iZXIoYykmJihjKz0icHgiKTtyZXR1cm4gY312YXIgdD1bInRvcCIsImxlZnQiLCJzY2FsZSJdO2Q9e2FuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZSxkKXthLl9hfHwoYS5fYT0wKTthLl9hKys7dmFyIGg9ZnVuY3Rpb24oKXthLl9hLS07ZCYmZCgpfTsKYS5xdWV1ZSgiZngiLFtmdW5jdGlvbigpe2EuYW5pbWF0ZShiLHtkdXJhdGlvbjpjLGVhc2luZzoibGluZWFyIj09PWU/ZToic3dpbmciLGNvbXBsZXRlOmgscXVldWU6ITF9KX1dKX0sZmFkZUluOmZ1bmN0aW9uKGEsYixjLGUpe2lmKGEuaGFzQ2xhc3MoImFvay1oaWRkZW4iKXx8YS5oYXNDbGFzcygiYS1oaWRkZW4iKSlhLmNzcygiZGlzcGxheSIsIm5vbmUiKSxhLnJlbW92ZUNsYXNzKCJhb2staGlkZGVuIGEtaGlkZGVuIik7YS5mYWRlSW4oe2R1cmF0aW9uOmIsZWFzaW5nOiJsaW5lYXIiPT09Yz9jOiJzd2luZyIsY29tcGxldGU6ZSxxdWV1ZTohMX0pfSxmYWRlT3V0OmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPWEuY3NzKCJvcGFjaXR5Iik7YS5mYWRlT3V0KHtkdXJhdGlvbjpiLGVhc2luZzoibGluZWFyIj09PWM/Yzoic3dpbmciLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Ljk1PitkJiZhLmNzcygib3BhY2l0eSIsZCk7ZSYmZSgpfSxxdWV1ZTohMX0pfSxmYWRlVG9nZ2xlOmZ1bmN0aW9uKGEsCmIsYyxlKXthLmZhZGVUb2dnbGUoe2R1cmF0aW9uOmIsZWFzaW5nOiJsaW5lYXIiPT09Yz9jOiJzd2luZyIsY29tcGxldGU6ZSxxdWV1ZTohMX0pfSxzbGlkZVVwOmZ1bmN0aW9uKGEsYixjLGUpe2Euc2xpZGVVcCh7ZHVyYXRpb246YixlYXNpbmc6ImxpbmVhciI9PT1jP2M6InN3aW5nIixjb21wbGV0ZTplLHF1ZXVlOiExfSl9LHNsaWRlRG93bjpmdW5jdGlvbihhLGIsYyxlKXthLnNsaWRlRG93bih7ZHVyYXRpb246YixlYXNpbmc6ImxpbmVhciI9PT1jP2M6InN3aW5nIixjb21wbGV0ZTplLHF1ZXVlOiExfSl9LHNsaWRlVG9nZ2xlOmZ1bmN0aW9uKGEsYixjLGUpe2Euc2xpZGVUb2dnbGUoe2R1cmF0aW9uOmIsZWFzaW5nOiJsaW5lYXIiPT09Yz9jOiJzd2luZyIsY29tcGxldGU6ZSxxdWV1ZTohMX0pfSxpc0FuaW1hdGVkOmZ1bmN0aW9uKGEpe2E9YS5qcXVlcnk/YVswXTphO3JldHVybiBhLl9hJiYwPGEuX2F9fTt2YXIgcj17YW5pbWF0ZTpmdW5jdGlvbihhLGMsZixkLHQpe3ZhciByPQphWzBdO2M9Zy5jb3B5KGMpO2Y9dm9pZCAwPT09Zj8yNTA6ZjtkPWR8fCJsaW5lYXIiO3ZvaWQgMCE9PWMudG9wJiYoYy50b3A9cChhLCJ0b3AiLGMudG9wKSk7dm9pZCAwIT09Yy5sZWZ0JiYoYy5sZWZ0PXAoYSwibGVmdCIsYy5sZWZ0KSk7aChhLCJ0cmFuc2l0aW9uIiw0PmY/ImFsbCAwbXMiOiJhbGwgIitmKyJtcyAiK2QpO2lmKDQ8Zil7dm9pZCAwPT09ci5fYSYmKHIuX2E9MCk7ci5fYSsrO3ZhciBuPWZ1bmN0aW9uKCl7ci5fYS0tO3IuX2F8fGgoYSwidHJhbnNpdGlvbiIsIiIpO3QmJnQoKX07Zy5kZWxheShmdW5jdGlvbigpe2cuZGVsYXkobixmKX0sMCl9ay5jYXBhYmlsaXRpZXMudHJhbnNmb3JtJiYoZD1lKGMpKSYmaChhLCJ0cmFuc2Zvcm0iLGIoe3RvcDpkLnRvcCxsZWZ0OmQubGVmdCxzY2FsZTpkLnNjYWxlfSkpO2cub2JqZWN0SXNFbXB0eShjKXx8YS5jc3MoYyk7ND49ZiYmdCYmZy5kZWxheSh0LDApfSxmYWRlSW46ZnVuY3Rpb24oYSxiLGMsZSl7aWYoIm5vbmUiPT09CmEuY3NzKCJkaXNwbGF5Iil8fC4wNT4rYS5jc3MoIm9wYWNpdHkiKSl7dmFyIGQ9YS5jc3MoIm9wYWNpdHkiKXx8MTtpZighZHx8LjA1PitkKWQ9MTthLmNzcygib3BhY2l0eSIsIjAiKS5yZW1vdmVDbGFzcygiYS1oaWRkZW4gYW9rLWhpZGRlbiIpLnNob3coKTt2YXIgaD10aGlzLmFuaW1hdGU7Zy5kZWxheShmdW5jdGlvbigpe2goYSx7b3BhY2l0eTpkfSxiLGMsZnVuY3Rpb24oKXtlJiZlKCl9KX0sMTYpfWVsc2UgZSYmZSgpfSxmYWRlT3V0OmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPWEuY3NzKCJvcGFjaXR5Iik7Im5vbmUiIT09YS5jc3MoImRpc3BsYXkiKSYmLjA1PCtkP3RoaXMuYW5pbWF0ZShhLHtvcGFjaXR5OjB9LGIsYyxmdW5jdGlvbigpe2EuaGlkZSgpLmNzcygib3BhY2l0eSIsZCk7ZSYmZSgpfSk6ZSYmZSgpfSxmYWRlVG9nZ2xlOmZ1bmN0aW9uKGEsYixjLGUpeygibm9uZSI9PT1hLmNzcygiZGlzcGxheSIpfHwuMDU+K2EuY3NzKCJvcGFjaXR5Iik/dGhpcy5mYWRlSW46CnRoaXMuZmFkZU91dCkuY2FsbCh0aGlzLGEsYixjLGUpfSxzbGlkZVVwOmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXRoaXMuYW5pbWF0ZTthLmNzcyh7aGVpZ2h0OmEuaW5uZXJIZWlnaHQoKSxvdmVyZmxvdzoiaGlkZGVuIn0pO2cuZGVsYXkoZnVuY3Rpb24oKXtkKGEse2hlaWdodDowfSxiLGMsZnVuY3Rpb24oKXthLmhpZGUoKTthLmNzcyh7aGVpZ2h0OiIiLG92ZXJmbG93OiIifSk7ZSYmZSgpfSl9LDApfSxzbGlkZURvd246ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGQ9YS5pbm5lckhlaWdodCgpLGg9dGhpcy5hbmltYXRlO2EuY3NzKHtoZWlnaHQ6MCxvdmVyZmxvdzoiaGlkZGVuIn0pO2Euc2hvdygpO2cuZGVsYXkoZnVuY3Rpb24oKXtoKGEse2hlaWdodDpkfSxiLGMsZnVuY3Rpb24oKXtlJiZlKCk7YS5jc3Moe2hlaWdodDoiIixvdmVyZmxvdzoiIn0pfSl9LDApfSxzbGlkZVRvZ2dsZTpmdW5jdGlvbihhLGIsYyxlKXsoYS5pcygiOnZpc2libGUiKT90aGlzLnNsaWRlVXA6dGhpcy5zbGlkZURvd24pLmNhbGwodGhpcywKYSxiLGMsZSl9LGlzQW5pbWF0ZWQ6ZnVuY3Rpb24oYSl7YT1hLmpxdWVyeT9hWzBdOmE7cmV0dXJuIGEuX2EmJjA8YS5fYX19O3JldHVybiBrLmNhcGFiaWxpdGllcy50cmFuc2l0aW9uP3I6ZH0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiKS5yZWdpc3RlcigiYS1pbWFnZS1sYXp5LWxvYWRlciIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKCl7YigiLmEtbGF6eS1sb2FkZWQiKS5lYWNoKGZ1bmN0aW9uKCl7ZS5zZXQoYih0aGlzKSl9KX1mdW5jdGlvbiBjKCl7dmFyIGM9W107YigiLmEtbGF6eS1sb2FkZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGc9Yih0aGlzKTtnLmRhdGEoInNyYyIpJiZoKGcpJiYoZy5sb2FkKGZ1bmN0aW9uKCl7ZC50cmlnZ2VyKCJhOmltYWdlOmxhenlMb2FkZWQiLGcpO2soKX0pLGMucHVzaChnKSxnLnJlbW92ZUNsYXNzKCJhLWxhenktbG9hZGVkIiksZS5yZW1vdmUoZykpfSk7ZC5lYWNoKGMsZnVuY3Rpb24oYil7Yi5hdHRyKCJzcmMiLGIuZGF0YSgic3JjIikpfSl9CmZ1bmN0aW9uIGgoYyl7ZS5nZXQoYyl8fGUuc2V0KGMpO3ZhciBkPWIobiksaD1kLnNjcm9sbFRvcCgpLGQ9bi5pbm5lckhlaWdodD9uLmlubmVySGVpZ2h0OmQuaGVpZ2h0KCksYT1oK2QrNTAwLGg9aC01MDAsZz1lLmdldChjKTtjPWcudG9wO3ZhciBnPWcuaGVpZ2h0LGY9YytnO3JldHVybiBjPj1oJiZjPGF8fGY+aCYmZjw9YXx8Zz5kJiZjPD1oJiZmPj1hfXZhciBiPWQuJCxlPWZ1bmN0aW9uKCl7dmFyIGI9e30sYz0wO3JldHVybntnZXQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGJbYy5kYXRhKCJjYWNoZUtleSIpXX0sc2V0OmZ1bmN0aW9uKGUpe2UuZGF0YSgiY2FjaGVLZXkiKXx8KGUuZGF0YSgiY2FjaGVLZXkiLGMpLGMrKyk7YltlLmRhdGEoImNhY2hlS2V5IildPXt0b3A6ZS5vZmZzZXQoKS50b3AsaGVpZ2h0OmUuaGVpZ2h0KCl9fSxyZW1vdmU6ZnVuY3Rpb24oYyl7Yy5kYXRhKCJjYWNoZUtleSIpJiZkZWxldGUgYltjLmRhdGEoImNhY2hlS2V5IildfX19KCk7aygpO2MoKTtkLm9uKCJzY3JvbGwiLApmdW5jdGlvbigpe2MoKX0pO2Qub24oInNjcm9sbCIsZC5kZWJvdW5jZShmdW5jdGlvbigpe2soKTtjKCl9LDI1MCkpO2Qub24oInJlc2l6ZSIsYyk7ZC5vbigiYTppbWFnZTpsYXp5TG9hZCIsYyk7ZC5vbi5yZWFkeShjKX0pOyJ1c2Ugc3RyaWN0IjttLnJlZ2lzdGVyKCJhLWltYWdlLXVybC1rZXktaGFuZGxlciIsZnVuY3Rpb24oKXtyZXR1cm57Z2VuZXJhdGU6ZnVuY3Rpb24oZCxnKXtyZXR1cm4gZH0scGFyc2U6ZnVuY3Rpb24oZCl7cmV0dXJue3VybDpkfX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiYS1iYXNlIiwiYS11dGlsIiwiYS1ldmVudHMiLCJhLWRlZmVyIiwicC1kZXRlY3QiLCJhLWltYWdlLXVybC1rZXktaGFuZGxlciIpLnJlZ2lzdGVyKCJhLWltYWdlIixmdW5jdGlvbihkLGcsayxjLGgsYil7ZnVuY3Rpb24gZShhKXthPXQoYSk7dmFyIGI9YS5kYXRhKCJhLWR5bmFtaWMtaW1hZ2UiKTtpZihiJiYib2JqZWN0Ij09PXR5cGVvZiBiKXt2YXIgYz1hLmRhdGEoImEtZHluYW1pYy1pbWFnZS1jb250YWluZXIiKTsKInVuZGVmaW5lZCI9PT10eXBlb2YgYyYmKGM9YS5jbG9zZXN0KCIuYS1keW5hbWljLWltYWdlLWNvbnRhaW5lciIpLDA9PT1jLmxlbmd0aCYmKGM9YS5wYXJlbnQoKSksYS5kYXRhKCJhLWR5bmFtaWMtaW1hZ2UtY29udGFpbmVyIixjKSk7dmFyIGU9aC5jYXBhYmlsaXRpZXMuaGlyZXMmJm4uZGV2aWNlUGl4ZWxSYXRpbz9uLmRldmljZVBpeGVsUmF0aW86MSxkPWMud2lkdGgoKSplLGs9Yy5oZWlnaHQoKSplLGw9TnVtYmVyLk1BWF9WQUxVRSxwPU51bWJlci5NQVhfVkFMVUUscj1hLmF0dHIoInNyYyIpfHwiIixxLG09ZC9rO2cuZWFjaChiLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGFyc2VJbnQoYVswXSwxMCk7YT1wYXJzZUludChhWzFdLDEwKTtjLT1rO2EtPWQ7Yz0xPD1tP2E6YztNYXRoLmFicyhjKTxwJiYwPD1jJiYocD1NYXRoLmFicyhjKSxxPWIpO01hdGguYWJzKGMpPGwmJihsPU1hdGguYWJzKGMpLHI9Yil9KTtxJiYocj1xKTtmLnNjaGVkdWxlKHIsYSk7Zi5maWxsKCk7cmV0dXJuIHJ9fQpmdW5jdGlvbiBwKCl7dCgiaW1nLmEtZHluYW1pYy1pbWFnZSIpLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmRhdGEoImEtbWFudWFsLXJlcGxhY2VtZW50Iil8fGUodGhpcyl9KX12YXIgdD1kLiQ7dChuKTt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIiksYT17fSxxPTAsZj1mdW5jdGlvbigpe3ZhciBjPVtdLGU9e307cmV0dXJue3NjaGVkdWxlOmZ1bmN0aW9uKGQsZil7ZD1iLmdlbmVyYXRlKGQsZi5hdHRyKCJjcm9zc29yaWdpbiIpKTtlW2RdfHwoYy5wdXNoKGQpLGVbZF09ITApO2FbZF09YVtkXXx8W107Zm9yKHZhciBoPTA7aDxhW2RdLmxlbmd0aDtoKyspaWYoZi5pcyhhW2RdW2hdKSlyZXR1cm47YVtkXS5wdXNoKGYpfSxmaWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTwyLXE7YSsrKWlmKDA8Yy5sZW5ndGgpe3ZhciBiPWMuc2hpZnQoKTtlW2JdPSExO2wubG9hZChiKX19fX0oKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShkKXt2YXIgZj1hW2RdLApoPWIucGFyc2UoZCkudXJsO2YmJihnLmVhY2goZixmdW5jdGlvbihhKXthLmRhdGEoImEtaW1hZ2UtcmVwbGFjZWQiKSE9PWgmJihhLmRhdGEoImEtaW1hZ2UtcmVwbGFjZWQiLGgpLGMuZGVmZXIoZnVuY3Rpb24oKXthLmF0dHIoInNyYyIsaCk7ay50cmlnZ2VyKCJhOmltYWdlOmxvYWQiLHskaW1hZ2VFbGVtZW50OmEsdXJsOmh9KTt2YXIgYj1hLmRhdGEoImEtaW1hZ2UtbmFtZSIpO2ImJmsudHJpZ2dlcigiYTppbWFnZTpsb2FkOiIrYix7JGltYWdlRWxlbWVudDphLHVybDpofSl9KSl9KSxhW2RdPVtdKX12YXIgZD17fTtyZXR1cm57bG9hZDpmdW5jdGlvbihhKXtpZihkW2FdKWUoYSk7ZWxzZSBpZighMSE9PWRbYV0pe3ZhciBoPW5ldyBJbWFnZTtoLm9ubG9hZD1mdW5jdGlvbigpe3EtLTtlKGEpO2RbYV09ITA7Zi5maWxsKCl9O2gub25lcnJvcj1mdW5jdGlvbigpe3EtLTtkW2FdPSExO2YuZmlsbCgpfTtxKys7Yy5kZWZlcihmdW5jdGlvbigpe3ZhciBjPWIucGFyc2UoYSksZT0KYy5jcm9zc09yaWdpbjtlJiYoaC5jcm9zc09yaWdpbj1lKTtoLnNyYz1jLnVybH0pfX0scG9sbDpmdW5jdGlvbigpe2cuaXNQYWdlSGlkZGVuKCl8fGcuZWFjaChyLGZ1bmN0aW9uKGEpe2E9dChhKTshYS5kYXRhKCJhLWhpcmVzIil8fGEuZGF0YSgiYS1oaXJlcy1sb2FkZWQiKXx8YS5kYXRhKCJhLW1hbnVhbC1yZXBsYWNlbWVudCIpfHxhLmlzKCI6aGlkZGVuIil8fCFnLm9uU2NyZWVuKGEpfHwoZi5zY2hlZHVsZShhLmRhdGEoImEtaGlyZXMiKSxhKSxhLmRhdGEoImEtaGlyZXMtbG9hZGVkIiwhMCkpfSl9fX0oKTtoLmNhcGFiaWxpdGllcy5oaXJlcyYmay5vbi5yZWFkeShmdW5jdGlvbigpe2cuaW50ZXJ2YWwoZnVuY3Rpb24oKXtsLnBvbGwoKTtmLmZpbGwoKX0sMkUzKX0pO2sub24ucmVhZHkocCk7dChuKS5yZXNpemUocCk7cmV0dXJue2xvYWRIaVJlc0ltYWdlOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO3QoYSkuZWFjaChmdW5jdGlvbigpe3ZhciBhPXQodGhpcyksYz1hLmRhdGEoImEtaGlyZXMiKTsKYyYmKGYuc2NoZWR1bGUoYyxhKSxmLmZpbGwoKSxiLnB1c2goYykpO2EuZGF0YSgiYS1oaXJlcy1sb2FkZWQiLCEwKX0pO3JldHVybiBifSxsb2FkRHluYW1pY0ltYWdlOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO3QoYSkuZWFjaChmdW5jdGlvbigpe2IucHVzaChlKHRoaXMpKX0pO3JldHVybiBifSxsb2FkSW1hZ2VNYW51YWxseTpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO3QoYSxiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9dCh0aGlzKTtpZighYS5kYXRhKCJhLWltYWdlLWFscmVhZHktbG9hZGVkIikpe2EuZGF0YSgiYS1pbWFnZS1hbHJlYWR5LWxvYWRlZCIsITApO3ZhciBiPWUoYSksZD10KCJceDNjaW1nXHgzZSIpLmF0dHIoInNyYyIsYnx8YS5kYXRhKCJhLWltYWdlLXNvdXJjZSIpKTtjLnB1c2goYik7dmFyIGI9IiIrdGhpcy5jbGFzc05hbWUsZj1hLmRhdGEoImEtZXh0cmEtY2xhc3NlcyIpO2YmJihiKz0iICIrZik7ZC5hdHRyKCJjbGFzcyIsYik7ZC5hdHRyKCJpZCIsdGhpcy5pZCk7CmQuYXR0cigic3R5bGUiLGEuYXR0cigic3R5bGUiKSk7ZC5hdHRyKCJhbHQiLGEuYXR0cigiYWx0IikpO2QuYXR0cigidXNlbWFwIixhLmF0dHIoInVzZW1hcCIpKTtkLmF0dHIoInRpdGxlIixhLmF0dHIoInRpdGxlIikpO2QuYXR0cigicm9sZSIsYS5hdHRyKCJyb2xlIikpOyhiPWEuZGF0YSgiYS1pbWFnZS1jcm9zc29yaWdpbiIpKSYmZC5hdHRyKCJjcm9zc29yaWdpbiIsYik7Zy5lYWNoKHRoaXMuYXR0cmlidXRlcyxmdW5jdGlvbihhKXthJiZhLm5hbWUmJigwPT09YS5uYW1lLmluZGV4T2YoImRhdGEtIil8fDA9PT1hLm5hbWUuaW5kZXhPZigiYXJpYS0iKSkmJmQuYXR0cihhLm5hbWUsYS52YWx1ZSl9KTtkLmRhdGEoYS5kYXRhKCkpO2EucmVwbGFjZVdpdGgoZCl9cmV0dXJuIGN9KX0sbG9hZERlc2NlbmRhbnRJbWFnZXNNYW51YWxseTpmdW5jdGlvbihhLGIpe2E9dChhLGIpLmZpbmQoImRpdi5hLW1hbnVhbGx5LWxvYWRlZCIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0KHRoaXMpLmRhdGEoImEtaW1hZ2UtYWxyZWFkeS1sb2FkZWQiKX0pOwpyZXR1cm4gdGhpcy5sb2FkSW1hZ2VNYW51YWxseShhKX19fSk7bS5yZWdpc3RlcigiYS1jbGFzcyIsZnVuY3Rpb24oKXtmdW5jdGlvbiBkKCl7fXZhciBnPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztkLmV4dGVuZD1mdW5jdGlvbihrKXt2YXIgYz10aGlzLnByb3RvdHlwZSxoPU9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZShjKTpmdW5jdGlvbihiKXtmdW5jdGlvbiBjKCl7fWMucHJvdG90eXBlPWI7cmV0dXJuIG5ldyBjfShjKSxiO2ZvcihiIGluIGspaFtiXT0iZnVuY3Rpb24iPT09dHlwZW9mIGtbYl0mJiJmdW5jdGlvbiI9PT10eXBlb2YgY1tiXSYmZy50ZXN0KGtbYl0pP2Z1bmN0aW9uKGIsZCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5fc3VwZXI7dGhpcy5fc3VwZXI9Y1tiXTt2YXIgZz1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLl9zdXBlcj1oO3JldHVybiBnfX0oYixrW2JdKTprW2JdO2s9ImZ1bmN0aW9uIj09PXR5cGVvZiBoLmluaXQ/CmguaGFzT3duUHJvcGVydHkoImluaXQiKT9oLmluaXQ6ZnVuY3Rpb24oKXtjLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ay5wcm90b3R5cGU9aDtoLmNvbnN0cnVjdG9yPWs7ay5leHRlbmQ9ZC5leHRlbmQ7cmV0dXJuIGt9O3JldHVybntjcmVhdGVDbGFzczpmdW5jdGlvbihnKXtyZXR1cm4gZC5leHRlbmQoZyl9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtdGltaW5nLWFuYWx5dGljcyIsImEtYm9keUJlZ2luIikuZXhlY3V0ZSgiYnVpbGQtQSIsZnVuY3Rpb24oZCl7dmFyIGc9bS5leGVjdXRlKCkuZGVjb3JhdGUsaz1tLndoZW4oImEtdXRpbCIsImEtZGVmZXIiLCJhLWJhc2UiLCJhLWV2ZW50cyIsImEtZGVjbGFyYXRpdmUiLCJhLXN0YXRlIiwiYS1hamF4IiwiYS1hbmltYXRlIiwiYS1pbWFnZSIsImEtY29uc3RhbnRzIiwiYS1kZXRlY3QiLCJhLWJyb3dzZXItZXZlbnRzIiwiYS1wcmVsb2FkIiwiYS1wcmVmaXgiLCJhLXJlcXVlc3QtYW5pbWF0aW9uLWZyYW1lIiwKImEtY2xhc3MiLCJhLWRyYWdnYWJsZSIpLnJlZ2lzdGVyKCJBIixmdW5jdGlvbihjKXtmdW5jdGlvbiBoKGUsZCl7dGhpcy5fZ3VhcmQ9ZTt0aGlzLl9sb2dFcnJvcj1kO2MuZWFjaChiLGZ1bmN0aW9uKGIpe2MuZXh0ZW5kKHRoaXMsbmV3IGIuY29uc3RydWN0b3IoZSxkKSl9LHRoaXMpfXZhciBiPVtdO2gucHJvdG90eXBlPXt9O2MuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSl7ZyYmZS5jb25zdHJ1Y3RvciE9PU9iamVjdD9iLnB1c2goZSk6KGRlbGV0ZSBlLmNvbnN0cnVjdG9yLGMuZXh0ZW5kKGgucHJvdG90eXBlLGUpKX0pO2Quc3RvcFdpZGdldExvZ2dpbmcoIkEiKTtyZXR1cm4gZz9oOmgucHJvdG90eXBlfSk7ZyYmay5kZWNvcmF0ZShmdW5jdGlvbihjLGQpe3JldHVybiBuZXcgYyhkLmd1YXJkLGQubG9nRXJyb3IpfSl9KTsidXNlIHN0cmljdCI7bS5yZWdpc3RlcigiYS1jb25zdGFudHMiLGZ1bmN0aW9uKCl7cmV0dXJue2NvbnN0YW50czp7a2V5Y29kZXM6e0JBQ0tTUEFDRTo4LApUQUI6OSxFTlRFUjoxMyxFU0NBUEU6MjcsU1BBQ0U6MzIsTEVGVF9BUlJPVzozNyxVUF9BUlJPVzozOCxSSUdIVF9BUlJPVzozOSxET1dOX0FSUk9XOjQwLERFTEVURTo0Nn0sZGVjbGFyYXRpdmVFdmVudHM6ImJsdXIgY2xpY2sgZGJsY2xpY2sgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBtb3VzZWRvd24gbW91c2V1cCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgbW91c2Vtb3ZlIGNoYW5nZSBzdWJtaXQgdG91Y2hzdGFydCB0b3VjaGVuZCB0b3VjaG1vdmUgdG91Y2hjYW5jZWwga2V5ZG93biBrZXl1cCBrZXlwcmVzcyBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIE1TUG9pbnRlckNhbmNlbCBwb2ludGVyY2FuY2VsIE1TUG9pbnRlck92ZXIgcG9pbnRlcmVudGVyIE1TUG9pbnRlck91dCBwb2ludGVybGVhdmUiLEhJREVfQ0xBU1M6ImFvay1oaWRkZW4iLFBBR0VTVEFURV9MT0FERURfTU9EVUxFX1BSRUZJWDoicGFnZS1zdGF0ZS1sb2FkZWQ6IiwKTk9PUDpmdW5jdGlvbigpe319fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImpRdWVyeSIsImEtZGV0ZWN0IiwiYS1ldmVudHMiLCJhLXV0aWwiLCJhLWRlZmVyIikucmVnaXN0ZXIoImEtYnJvd3Nlci1ldmVudHMiLGZ1bmN0aW9uKGQsZyxrLGMsaCl7ZnVuY3Rpb24gYigpe3JldHVybiB2b2lkIDA9PT1uLm9yaWVudGF0aW9uP3AoKT5lKCk/OTA6MDpuLm9yaWVudGF0aW9ufWZ1bmN0aW9uIGUoKXtyZXR1cm4gbi5pbm5lckhlaWdodD9uLmlubmVySGVpZ2h0OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gcCgpe3JldHVybiBuLmlubmVyV2lkdGg/bi5pbm5lcldpZHRoOmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aH1mdW5jdGlvbiB0KCl7cmV0dXJuIG4uaW5uZXJXaWR0aD9NYXRoLnJvdW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aC9uLmlubmVyV2lkdGgqMTApLzEwOjF9ZnVuY3Rpb24gcihhKXtzd2l0Y2goYSl7Y2FzZSBsLkFMTDphPQoib3JpZW50YXRpb24gaGVpZ2h0IHdpZHRoIHpvb20gc2Nyb2xsTGVmdCBzY3JvbGxUb3AiLnNwbGl0KCIgIik7YnJlYWs7Y2FzZSBsLlNDUk9MTDphPVsic2Nyb2xsTGVmdCIsInNjcm9sbFRvcCJdO2JyZWFrO2Nhc2UgbC5aT09NOmE9WyJoZWlnaHQiLCJ3aWR0aCIsInpvb20iLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsVG9wIl07YnJlYWs7ZGVmYXVsdDphPVsib3JpZW50YXRpb24iLCJoZWlnaHQiLCJ3aWR0aCIsInNjcm9sbExlZnQiLCJzY3JvbGxUb3AiXX1mb3IodmFyIGM9e30sZCxoO3ZvaWQgMCE9PShoPWEucG9wKCkpOylkPW1baF0sIm9yaWVudGF0aW9uIj09PWg/bVtoXT1iKCk6ImhlaWdodCI9PT1oP21baF09ZSgpOiJ3aWR0aCI9PT1oP21baF09cCgpOiJzY3JvbGxUb3AiPT09aD9tW2hdPW4uc2Nyb2xsWT9uLnNjcm9sbFk6Zi5zY3JvbGxUb3AoKToic2Nyb2xsTGVmdCI9PT1oP21baF09bi5zY3JvbGxYP24uc2Nyb2xsWDpmLnNjcm9sbExlZnQoKToiem9vbSI9PT1oJiYobVtoXT0KdCgpKSxtW2hdIT09ZCYmKGNbaF09ZCk7cmV0dXJuIGN9ZnVuY3Rpb24gYShhKXtpZihhPXdbYV0pYS5wb2xsQ291bnRlcj1hLm1heFBvbGxDb3VudCxhLmludGVydmFsSWR8fChhLmludGVydmFsSWQ9c2V0SW50ZXJ2YWwoYS5oYW5kbGVyLGEucG9sbEludGVydmFsKSl9ZnVuY3Rpb24gcShhKXsoYT13W2FdKSYmYS5pbnRlcnZhbElkJiYoY2xlYXJJbnRlcnZhbChhLmludGVydmFsSWQpLGEuaW50ZXJ2YWxJZD0wKX12YXIgZj1kKG4pLGw9e09SSUVOVEFUSU9OX0NIQU5HRToib3JpZW50YXRpb25jaGFuZ2UiLFNDUk9MTDoic2Nyb2xsIixSRVNJWkU6InJlc2l6ZSIsWk9PTToiem9vbSIsQUxMOiJhbGwifSxtPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjAsaGVpZ2h0OmUoKSx3aWR0aDpwKCksb3JpZW50YXRpb246YigpLHpvb206dCgpfTtrLm9uKCJiZWZvcmVSZWFkeSIsZnVuY3Rpb24oKXtyKGwuQUxMKX0pO3ZhciB1PXtzcGVlZDowLGRlZ3JlZTowLGRpcmVjdGlvbjoiIixwb3NpdGlvblg6MCwKcG9zaXRpb25ZOjB9LHY9W10seTtmLmJpbmQoIm1vdXNlbW92ZSIsYy50aHJvdHRsZShmdW5jdGlvbihhKXthPXt4OmEuY2xpZW50WCx5OmEuY2xpZW50WX07aWYoeSl7dmFyIGI9eSxjPTAsZT0wO3YucHVzaCh7c3BlZWQ6TWF0aC5zcXJ0KE1hdGgucG93KGEueC1iLngsMikrTWF0aC5wb3coYS55LWIueSwyKSkvNTAqMTAsZGVncmVlOk1hdGguYXRhbjIoYS55LWIueSxhLngtYi54KS8oTWF0aC5QSS8xODApfSk7NDx2Lmxlbmd0aCYmKHY9di5zbGljZSgtNCkpO2Zvcih2YXIgYj12Lmxlbmd0aCxkPTA7ZDxiO2QrKyljKz12W2RdLnNwZWVkLGUrPXZbZF0uZGVncmVlO2M9TnVtYmVyKChjL2IpLnRvRml4ZWQoMikpO2U9TWF0aC5yb3VuZChlL2IpO3U9e3NwZWVkOmMsZGVncmVlOmUsZGlyZWN0aW9uOjA8PWU/MTU3LjU8ZT8iVyI6MTEyLjU8ZT8iU1ciOjY3LjU8ZT8iUyI6MjIuNTxlPyJTRSI6IkUiOi0xNTcuNT5lPyJXIjotMTEyLjU+ZT8iTlciOi02Ny41PmU/Ik4iOi0yMi41PmU/CiJORSI6IkUiLHBvc2l0aW9uWDphLngscG9zaXRpb25ZOmEueX07eT1hfWVsc2UgYSYmKHk9YSl9LDUwKSk7Zi5iaW5kKGwuU0NST0xMLGMudGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgYT1yKGwuU0NST0xMKTtrLnRyaWdnZXIobC5TQ1JPTEwsbSxhKX0sMTAwKSk7dmFyIHc9e307Yy5lYWNoKFtsLlJFU0laRSxsLlpPT01dLGZ1bmN0aW9uKGEpe3dbYV09e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGxhc3RWaWV3cG9ydDpjLmNvcHkobSksbWF4UG9sbENvdW50OjUscG9sbENvdW50ZXI6NSxwb2xsSW50ZXJ2YWw6MTAwLGludGVydmFsSWQ6MH19KTt3LnJlc2l6ZS5oYW5kbGVyPWZ1bmN0aW9uKCl7dmFyIGE9W10sYj13LnJlc2l6ZTtyKCJyZXNpemUiKTt2YXIgZT1jLmRpZmYobSxiLmxhc3RWaWV3cG9ydCk7ZS5vcmllbnRhdGlvbiYmYS5wdXNoKGwuT1JJRU5UQVRJT05fQ0hBTkdFKTtlLndpZHRofHxlLmhlaWdodD9hLnB1c2gobC5SRVNJWkUpOmcuY2FwYWJpbGl0aWVzLmlzSUVUb3VjaENhcGFibGUmJgplLnNjcm9sbFRvcCYmYS5wdXNoKGwuUkVTSVpFKTthLmxlbmd0aCYmKGIubGFzdFZpZXdwb3J0PWMuY29weShtKSxjLmVhY2goYSxmdW5jdGlvbihhKXtrLnRyaWdnZXIoYSxtLGUpfSkpOzA9PT0tLWIucG9sbENvdW50ZXImJnEobC5SRVNJWkUpfTt3LnJlc2l6ZS5wb2xsSW50ZXJ2YWw9MTAwO3cucmVzaXplLm1heFBvbGxDb3VudD0xMDtmLmJpbmQobC5SRVNJWkUsZnVuY3Rpb24oYil7YShsLlJFU0laRSl9KTt3Lnpvb20uaGFuZGxlcj1mdW5jdGlvbigpe3IobC5aT09NKTt2YXIgYT13Lnpvb20sYj1jLmRpZmYobSxhLmxhc3RWaWV3cG9ydCk7Yi56b29tJiYoYS5sYXN0Vmlld3BvcnQ9Yy5jb3B5KG0pLGsudHJpZ2dlcihsLlpPT00sbSxiKSk7MD09PS0tYS5wb2xsQ291bnRlciYmcShsLlpPT00pfTt3Lnpvb20ucG9sbEludGVydmFsPTIwMDtnLmNhcGFiaWxpdGllcy5hbmRyb2lkJiZmLmJpbmQoInRvdWNoY2FuY2VsIixmdW5jdGlvbihiKXsyPT09Yi5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmCih3Lnpvb20ubWF4UG9sbENvdW50PTE1LGEobC5aT09NKSl9KTtnLmNhcGFiaWxpdGllcy5pb3MmJmYuYmluZCgidG91Y2hlbmQiLGZ1bmN0aW9uKGIpezE9PT1iLm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGgmJih3Lnpvb20ubWF4UG9sbENvdW50PTEsYShsLlpPT00pKX0pO2cuY2FwYWJpbGl0aWVzLmlvc3x8Zy5jYXBhYmlsaXRpZXMuYW5kcm9pZHx8Zi5iaW5kKCJyZXNpemUiLGZ1bmN0aW9uKGIpe3cuem9vbS5tYXhQb2xsQ291bnQ9NTthKGwuWk9PTSl9KTtyZXR1cm57dmlld3BvcnQ6ZnVuY3Rpb24oYSl7YSYmcihsLkFMTCk7cmV0dXJuIGMuY29weShtKX0sY3Vyc29yOmZ1bmN0aW9uKCl7cmV0dXJuIGMuY29weSh1KX0sc2Nyb2xsQmFyV2lkdGg6ZnVuY3Rpb24oYSl7aWYoYXx8KGRvY3VtZW50JiZkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodD9kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDowKT5lKCkpe2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmEuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIjthLnN0eWxlLndpZHRoPSIxMDAlIjthLnN0eWxlLm92ZXJmbG93WD0ic2Nyb2xsIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO3ZhciBiPWEub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7cmV0dXJuIGJ9cmV0dXJuIDB9fX0pOyJ1c2Ugc3RyaWN0IjttLnJlZ2lzdGVyKCJhLWFuYWx5dGljcyIsZnVuY3Rpb24oKXtmdW5jdGlvbiBkKGQsayl7dmFyIGM9biYmbi51ZSYmbi51ZS5jb3VudDtpZihjJiZkKXt2YXIgaD0iYXVpOiIrZDsxPGFyZ3VtZW50cy5sZW5ndGgmJmMoaCxrKTtyZXR1cm4gYyhoKX19cmV0dXJue2luY3JlbWVudDpmdW5jdGlvbihnLGspe2lmKGcpe3ZhciBjPWQoZyl8fDA7ZChnLGMrKGt8fDEpKX19LGNvdW50OmQsbG9nRXJyb3I6ZnVuY3Rpb24oZCxrLGMpe24udWVMb2dFcnJvciYmbi51ZUxvZ0Vycm9yKHttZXNzYWdlOmR9LHtsb2dMZXZlbDprLGF0dHJpYnV0aW9uOmN9KX19fSk7CiJ1c2Ugc3RyaWN0IjttLndoZW4oIjNwLXByb21pc2UiLCJhLWFuYWx5dGljcyIpLnJlZ2lzdGVyKCJhLXByZWxvYWQiLGZ1bmN0aW9uKGQsZyl7ZnVuY3Rpb24gaygpe2lmKDA8Ri5sZW5ndGgpeT1GO2Vsc2UgaWYoeT13LDA9PT15Lmxlbmd0aHx8IXopcmV0dXJuITE7aWYoRT49SSlyZXR1cm4hMTtFKys7cmV0dXJuITB9ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPWZ1bmN0aW9uKCl7aWYoYSl7dmFyIGI9YS5wYXJlbnRFbGVtZW50O2ImJmIucmVtb3ZlQ2hpbGQoYSk7YT1udWxsfX07YiYmY2xlYXJUaW1lb3V0KGIpO0U9MT5FPzA6RS0xO0I/cShjLDUpOmMoKTtBP3EodCwwKTp0KCl9ZnVuY3Rpb24gaChhKXt2YXIgYixjO2M9YS5pbmRleE9mKCIjIik7dmFyIGU9YS5pbmRleE9mKCI/IiksZT0wPGU/ZTowPGM/YzphLmxlbmd0aDsoYz1hLmxhc3RJbmRleE9mKCIuIixlKSkmJihiPWEuc3Vic3RyaW5nKGMrMSxlKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4iZ3oiPT09Yj9oKGEuc3Vic3RyaW5nKDAsCmMpKTpifWZ1bmN0aW9uIGIoYSl7Zm9yKHZhciBiPUcubGVuZ3RoO2ItLTspaWYoR1tiXT09PWEpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZShhLGIsYyl7dmFyIGU7Qj8ianMiIT09YiYmKGU9Ik9CSkVDVCIpOkE/KGU9IklNRyIsYXx8KDEwPD1DP2U9IkxJTksiOjk9PT1DJiYoZT0iU0NSSVBUIikpKTplPSJJTUciO3JldHVybiBlfWZ1bmN0aW9uIHAoYSxiLGUsZCl7dmFyIGY7aWYoQnx8RCYmIWUpZj1xKGZ1bmN0aW9uKCl7ZCgpO2MoYSxmKX0sMjUwMCsxMDAqTWF0aC5yYW5kb20oKSk7YS5vbmVycm9yPWZ1bmN0aW9uKCl7ZCgpO2MoYSxmKX07YS5vbmxvYWQ9ZnVuY3Rpb24oKXtkKCk7YyhhLGYpfX1mdW5jdGlvbiB0KCl7ZnVuY3Rpb24gYSgpe3ZhciBiPURhdGUubm93KCkteDtkLnJlc29sdmUoe3VybDpyLHN1Y2Nlc3M6ITAsZHVyYXRpb246Yn0pfWlmKGsoKSl7dmFyIGQ9eS5wb3AoKSxyPWQudXJsLG09aChyKSxuPWIobSksbT1lKG4sbSx5PT09Riksdz0xLHU9IiIseD0KRGF0ZS5ub3coKSx2O2lmKG0pe3Y9IklNRyI9PT1tP25ldyBJbWFnZTpmLmNyZWF0ZUVsZW1lbnQobSk7di5zdHlsZS5kaXNwbGF5PSJub25lIjtpZigiSUZSQU1FIj09PW0pZm9yKHc9MDtyOylCJiYianMiPT09aChyKXx8KHUrPSJceDNjbGluayByZWxceDNkJ3ByZWZldGNoJyBocmVmXHgzZCciK3IrIicvXHgzZSIsdysrKSxyPXkucG9wKCk7ZWxzZSJJTUciPT09bT8ocCh2LG0sbixhKSx2LnNyYz1yKToiT0JKRUNUIj09PW0/KHYuZGF0YT1yLHAodixtLG4sYSkpOiJTQ1JJUFQiPT09bT8odi50eXBlPSJ0ZXh0L2NhY2hlIixwKHYsbSxuLGEpLHYuc3JjPXIpOiJMSU5LIj09PW0mJih2LnJlbD0ic3R5bGVzaGVldCIsdi5tZWRpYT0ic3BlZWNoIixwKHYsbSxuLGEpLHYuaHJlZj1yKTtpZighQXx8IklNRyIhPT1tKXRyeXtpZihsLmFwcGVuZENoaWxkKHYpLHUpe3ZhciB6PXYuY29udGVudFdpbmRvdy5kb2N1bWVudDt6Lm9wZW4oKTt6LndyaXRlKHUpO3ouY2xvc2UoKTtxKGMsMCl9fWNhdGNoKEQpe2QucmVqZWN0KHt1cmw6ciwKc3VjY2VzczohMSxyZWFzb246ImZhaWxlZCB0byBhcHBlbmRDaGlsZCJ9KTtjKCk7cmV0dXJufWcuaW5jcmVtZW50KCJwcmVsb2FkX2Z1bGZpbGxlZCIsdyk7RTxJJiZ0KCl9ZWxzZSBkLnJlamVjdCh7dXJsOnIsc3VjY2VzczohMSxlcnJvcjoibm90IHN1cHBvcnRlZCB0eXBlIn0pLGMoKX19ZnVuY3Rpb24gcihhLGIpe3JldHVybiBuZXcgZChmdW5jdGlvbihjLGUpe2Euc3BsaWNlKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSphLmxlbmd0aCksMCx7dXJsOmIscmVzb2x2ZTpjLHJlamVjdDplfSl9KX1mdW5jdGlvbiBhKGIsYyl7aWYoIUgpcmV0dXJuIGQucmVqZWN0KCJub3Qgc3VwcG9ydGVkIGJyb3dzZXIiKTtpZigic3RyaW5nIj09PXR5cGVvZiBiKWI9W2JdO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuIGQucmVqZWN0KCJub3QgYW4gVVJMIG9yIFVSTCBsaXN0Iik7dmFyIGUsZixoPVtdO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspKGY9YltlXSkmJgoic3RyaW5nIiE9PXR5cGVvZiBmP2EoZixjKTpmJiYiICIhPT1mWzBdJiYoaC5wdXNoKHIoYyxmKSksZy5pbmNyZW1lbnQoInByZWxvYWRfYXNrcyIpKTtyZXR1cm4gMD09PWgubGVuZ3RoP2QucmVzb2x2ZSgpOjE9PT1oLmxlbmd0aD9oWzBdOmQuYWxsKGgpfXZhciBxPXNldFRpbWVvdXQsZj1kb2N1bWVudCxsPWYuZG9jdW1lbnRFbGVtZW50LHg9bC5zdHlsZSx1PW5hdmlnYXRvcix2PXUudXNlckFnZW50LHk9W10sdz1bXSxGPVtdLHo9ITEsQj0iTW96QXBwZWFyYW5jZSJpbiB4LEQ9IUImJiJ3ZWJraXRBcHBlYXJhbmNlImluIHg7RCYmL15BcHBsZS8udGVzdCh1LnZlbmRvcik7dmFyIEE9IUImJiFEJiYoMD09PXUuYXBwTmFtZS5pbmRleE9mKCJNaWNyb3NvZnQiKXx8LTE8di5pbmRleE9mKCJUcmlkZW50LyIpKSxIPUR8fEJ8fEEseD1BP251bGwhPT0vVHJpZGVudFwvKFtcZF0rKS8uZXhlYyh2KT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSk6bnVsbDotMSxDPUE/eD94KzQ6NjotMSxJPSJ1bmRlZmluZWQiIT09CnR5cGVvZiBuLnBsQ291bnQ/bi5wbENvdW50KCk6QSYmOD5DPzI6NSxFPTAsSj0hMSxHPVsiZ2lmIiwianBlZyIsImpwZyIsInBuZyJdO20ud2hlbigiYS1wcmVsb2FkLWFwaS11c2VkIiwiYWZ0ZXJMb2FkIikuZXhlY3V0ZSgiYS1wcmVsb2FkLWxvdy1wcmlvcml0eSIsZnVuY3Rpb24oKXt6PSEwO3QoKX0pO3JldHVybntwcmVsb2FkOmZ1bmN0aW9uKGIsYyl7Yz9iPWEoYixGKTooSnx8KEo9ITAsbS5kZWNsYXJlKCJhLXByZWxvYWQtYXBpLXVzZWQiKSksYj1hKGIsdykpO3QoKTtyZXR1cm4gYn19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiYS11dGlsIikucmVnaXN0ZXIoImEtcmVxdWVzdC1hbmltYXRpb24tZnJhbWUiLGZ1bmN0aW9uKGQpe2Zvcih2YXIgZz0wLGs9WyJtcyIsIm1veiIsIndlYmtpdCIsIm8iXSxjPTA7YzxrLmxlbmd0aCYmIW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lOysrYyluLnJlcXVlc3RBbmltYXRpb25GcmFtZT1uW2tbY10rIlJlcXVlc3RBbmltYXRpb25GcmFtZSJdLApuLmNhbmNlbEFuaW1hdGlvbkZyYW1lPW5ba1tjXSsiQ2FuY2VsQW5pbWF0aW9uRnJhbWUiXXx8bltrW2NdKyJDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXTtuLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KG4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGMsYil7dmFyIGU9ZC5ub3coKSxrPU1hdGgubWF4KDAsMTYtKGUtZykpO2I9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhlK2spfSxrKTtnPWUraztyZXR1cm4gYn0pO24uY2FuY2VsQW5pbWF0aW9uRnJhbWV8fChuLmNhbmNlbEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGMpe2NsZWFyVGltZW91dChjKX0pO3JldHVybntyZXF1ZXN0QW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24oYyxiKXtyZXR1cm4gbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYyxiKX0sY2FuY2VsQW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24oYyl7bi5jYW5jZWxBbmltYXRpb25GcmFtZShjKX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigialF1ZXJ5IiwiQSIsCiIzcC1wcm9taXNlIikucmVnaXN0ZXIoImEtZm9udHMiLGZ1bmN0aW9uKGQsZyxrKXtmdW5jdGlvbiBjKGIsYSl7dmFyIGM9bSYmbVtiXT9tOmE7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGNbYl0uYXBwbHkoYyxhcmd1bWVudHMpfX12YXIgaD1bXSxiPWQoImJvZHkiKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrKGZ1bmN0aW9uKGIsYSl7dmFyIGM9bi5zZXRJbnRlcnZhbChmdW5jdGlvbigpe2cucmVkdWNlKGgsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmImxvYWRlZCI9PT1iLnN0YXR1c30sITApJiYoYigpLGNsZWFySW50ZXJ2YWwoYykpfSw1MCl9KX0oKSxwPXtsb2FkOmZ1bmN0aW9uKGMpe3JldHVybiBuZXcgayhmdW5jdGlvbihhLGUpe3ZhciBmPXt2YXJpYW50OmMsc3RhdHVzOiJ1bmxvYWRlZCJ9O2gucHVzaChmKTtmLiRsb2FkZXI9ZCgiXHgzY3NwYW5ceDNlLlx4M2Mvc3Bhblx4M2UiLHsiY2xhc3MiOiJhb2staGlkZGVuIn0pLmNzcygiZm9udCIsZi52YXJpYW50KS5hcHBlbmRUbyhiKTsKZi5zdGF0dXM9ImxvYWRpbmciO2YuJGNoZWNrZXI9ZCgiXHgzY3NwYW5ceDNlLlx4M2Mvc3Bhblx4M2UiLHsiY2xhc3MiOiJhb2staGlkZGVuIn0pLmFwcGVuZFRvKGIpO2YuaW50ZXJ2YWxJZD1uLnNldEludGVydmFsKGZ1bmN0aW9uKCl7Zi4kY2hlY2tlci5jc3MoImZvbnQiLGYudmFyaWFudCsnLCBDb25zb2xhcywgIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlJyk7dmFyIGI9Zi4kY2hlY2tlci53aWR0aCgpLGM9Zi4kY2hlY2tlci5oZWlnaHQoKTtmLiRjaGVja2VyLmNzcygiZm9udEZhbWlseSIsJ0NvbnNvbGFzLCAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2UnKTtpZihmLiRjaGVja2VyLndpZHRoKCkhPT1ifHxmLiRjaGVja2VyLmhlaWdodCgpIT09YylhKGYudmFyaWFudCksZi5zdGF0dXM9ImxvYWRlZCIsZi4kbG9hZGVyLnJlbW92ZSgpLGYuJGNoZWNrZXIucmVtb3ZlKCksY2xlYXJJbnRlcnZhbChmLmludGVydmFsSWQpfSw1MCl9KX0sY2hlY2s6ZnVuY3Rpb24oYil7Zy5lYWNoKGgsCmZ1bmN0aW9uKGEpe2lmKGEudmFyaWFudD09PWIpcmV0dXJuImxvYWRlZCI9PT1hLnN0YXR1c30pO3JldHVybiExfSxyZWFkeTplfSxtPWRvY3VtZW50LmZvbnRzO20mJm0ucmVhZHkmJihlPW0ucmVhZHkudGhlbj9tLnJlYWR5Om0ucmVhZHkuYXBwbHkobSkpO3JldHVybntsb2FkOmMoImxvYWQiLHApLGNoZWNrOmMoImNoZWNrIixwKSxyZWFkeTplfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiKS5yZWdpc3RlcigiYS1mb3JtLWNvbnRyb2xzLWFwaSIsZnVuY3Rpb24oZCl7dmFyIGc9ZC4kLGs9MCxjPWZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmpxdWVyeT9iOmImJjE9PT1iLm5vZGVUeXBlP2coYik6bnVsbH0saD1mdW5jdGlvbihiLGUsZCl7dmFyIGg9YyhiKTtpZighaHx8MSE9PWgubGVuZ3RoKXJldHVybiExO2I9aC5maW5kKCJpbnB1dCIpLmZpcnN0KCk7dm9pZCAwIT09ZSYmKGU9ISFlLGguaGFzQ2xhc3MoImEtdG91Y2gtbXVsdGktc2VsZWN0IikmJihoLmZpbmQoImkuYS1pY29uIikuZmlyc3QoKS50b2dnbGVDbGFzcygiYS1pY29uLXRvdWNoLW11bHRpLXNlbGVjdC1hY3RpdmUiLAplKS50b2dnbGVDbGFzcygiYS1pY29uLXRvdWNoLW11bHRpLXNlbGVjdCIsIWUpLGguYXR0cigiYXJpYS1jaGVja2VkIixlKSksYi5wcm9wKCJjaGVja2VkIikhPT1lJiZiLnByb3AoImNoZWNrZWQiLGUpLnRyaWdnZXIoImNoYW5nZSIpKTt2b2lkIDAhPT1kJiYoZD0hIWQsYi5wcm9wKCJkaXNhYmxlZCIpIT09ZCYmYi5wcm9wKCJkaXNhYmxlZCIsZCkpfTtyZXR1cm57ZmluZEZvcm1FbGVtZW50Q29udGFpbmVyOmZ1bmN0aW9uKGIpe2lmKChiPWMoYikpJiYxPT09Yi5sZW5ndGgpe3ZhciBlPWIuY2xvc2VzdCgiZm9ybSIpOzA9PT1lLmxlbmd0aCYmKGU9Yi5jbG9zZXN0KCJmaWVsZHNldCIpLDA9PT1lLmxlbmd0aCYmKGU9Zyhkb2N1bWVudCkpKTtyZXR1cm4gZX19LHRvZ2dsZUNoZWNrYm94U3RhdGU6ZnVuY3Rpb24oYil7Yj1jKGIpO3ZhciBlO2ImJjE9PT1iLmxlbmd0aCYmKGU9Yi5maW5kKCJpbnB1dCIpLmZpcnN0KCksaChiLCFlWzBdLmNoZWNrZWQpKX0sc2V0Q2hlY2tib3hTdGF0ZTpoLApzZXRSYWRpb1N0YXRlOmgsbm9ybWFsaXplRWxlbWVudDpmdW5jdGlvbihiKXtpZigoYj0oYj1jKGIpKT9iOmModGhpcykpJiYxPT09Yi5sZW5ndGgpe3ZhciBlPWIuZmluZCgiaW5wdXQiKS5maXJzdCgpO2UuYXR0cigidHlwZSIpO3ZhciBkPWIuaGFzQ2xhc3MoImEtdG91Y2gtbXVsdGktc2VsZWN0Iik7Yi5hdHRyKCJpZCIpfHxlLmF0dHIoImlkIil8fGQmJighZHx8Yi5wYXJlbnQoKS5hdHRyKCJpZCIpKXx8KGQ9ImEtZm9ybS1jb250cm9scy1hdXRvaWQtIitrLGIuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixkKS5maW5kKCIuYS1jaGVja2JveC1sYWJlbCwgLmEtcmFkaW8tbGFiZWwsIC5hLXRvdWNoLW11bHRpLXNlbGVjdC1pdGVtLWxhYmVsIikuYXR0cigiaWQiLGQpLGsrKyk7aChiLGVbMF0uY2hlY2tlZCxlWzBdLmRpc2FibGVkKX19LG5vcm1hbGl6ZUZpZWxkc2V0czpmdW5jdGlvbihiKXtnKGIpLmNsb3Nlc3QoImZpZWxkc2V0IikuZWFjaChmdW5jdGlvbihiLGMpe2I9ZyhjKTsKYz1iLmZpbmQoImxlZ2VuZCIpLmZpcnN0KCk7aWYoYy5sZW5ndGgpe3ZhciBkPWMuYXR0cigiaWQiKTtkfHwoZD0iYS1mb3JtLWNvbnRyb2xzLWF1dG9pZC0iK2ssYy5hdHRyKCJpZCIsZCksaysrKTtiLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLGQpfX0pfX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJqUXVlcnkiLCJhLXV0aWwiLCJhLXN0YXRlIiwiYS1hbmFseXRpY3MiLCJhLWNvbnN0YW50cyIpLmV4ZWN1dGUoInByZXBhcmUtYS13ZWJsYWIiLGZ1bmN0aW9uKGQsZyxrLGMsaCl7bS53aGVuKGguY29uc3RhbnRzLlBBR0VTVEFURV9MT0FERURfTU9EVUxFX1BSRUZJWCsiYS13bGFiLXN0YXRlcyIpLnJlZ2lzdGVyKCJhLXdlYmxhYiIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShhKXtmfHwodVthXT1xW2FdKTtyZXR1cm4gZiYmZlthXXx8cVthXX1mdW5jdGlvbiBrKGEpe3JldHVybiBlKGEpfHwiQyJ9ZnVuY3Rpb24gdChiKXt2YXIgYz1lKGIpOyFjfHxsW2JdfHx4W2JdfHwobFtiXT1jLApjbGVhclRpbWVvdXQodiksdj1zZXRUaW1lb3V0KGEsNUUzKSk7cmV0dXJuIGN8fCJDIn1mdW5jdGlvbiByKGEpe3JldHVybiB2b2lkIDAhPT1hJiZuLmVuY29kZVVSSUNvbXBvbmVudChhKXx8IiJ9ZnVuY3Rpb24gYSgpe3ZhciBhPVtdO2cuZWFjaChsLGZ1bmN0aW9uKGIsYyl7YS5wdXNoKGMrIjoiK2IpO3hbY109MX0pO2lmKGEubGVuZ3RoKXt2YXIgYj15K3IoYS5qb2luKCIsIikpKyJceDI2dFx4M2QiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKyJceDI2dHlwZVx4M2QiLGU9bi5uYXZpZ2F0b3I7ZS5zZW5kQmVhY29uJiZlLnNlbmRCZWFjb24oYisiYiIpP2MuaW5jcmVtZW50KCJ3bGFiQmNuIik6KChuZXcgSW1hZ2UpLnNyYz1iKyJpIixjLmluY3JlbWVudCgid2xhYkltZyIpKX1sPXt9O2NsZWFyVGltZW91dCh2KX12YXIgcT1ifHx7fSxmLGw9e30seD17fSx1PXt9LHY7bS53aGVuKGguY29uc3RhbnRzLlBBR0VTVEFURV9MT0FERURfTU9EVUxFX1BSRUZJWCsiYS1sdHJlZS1zdGF0ZXMiKS5leGVjdXRlKGZ1bmN0aW9uKGEpe2Y9CmF8fHt9O2cuZWFjaChnLmtleXModSksZnVuY3Rpb24oYSl7KGZbYV18fHVbYV0pJiZmW2FdIT09dVthXSYmbS5sb2coImEtd2VibGFiIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciAiK2ErIi4gSXQgcmV0dXJuZWQgIit1W2FdKyIuIGl0IGlzIHNldCBhcyAiK2ZbYV0rIiBhdCBhLWx0cmVlLXN0YXRlcy4iKX0pfSk7dmFyIHk9Ii9ncC9hdWkvcmVjb3JkLmh0bWw/cmlkXHgzZCIrcihuLnVlX2lkKSsiXHgyNnNpZFx4M2QiK3Iobi51ZV9zaWQpKyJceDI2d2xhYlx4M2QiO2QobikuYmluZCgidW5sb2FkIixhKTtyZXR1cm57aXM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybihjP3QoYSk6ayhhKSk9PT1ifSxpc0FjdGl2ZTpmdW5jdGlvbihhKXtyZXR1cm4hIWUoYSl9LG5vVHJpZ2dlcjprLHRyaWdnZXI6dH19KX0pOyJ1c2Ugc3RyaWN0IjttLmRlY2xhcmUoInBydjphLXBvc3QtYXRmLWNhdGNoZG9tcmVhZHkiLCEwKTttLndoZW4oImEtdXRpbCIsImEtZGVmZXIiLCJwcnY6YS1wb3N0LWF0Zi1jYXRjaGRvbXJlYWR5IikucmVnaXN0ZXIoInBydjphLXBvc3QtYXRmIiwKZnVuY3Rpb24oZCxnLGspe2Z1bmN0aW9uIGMoKXtlfHwoZT0hMCxkLmVhY2goYixmdW5jdGlvbihiKXtnLmRlZmVyKGIpfSksYj1bXSl9ZnVuY3Rpb24gaCgpe2smJmMoKX12YXIgYj1bXSxlPSExO20ud2hlbigiYWYiLCJjZiIpLmV4ZWN1dGUoImZsdXNoX3F1ZXVlZF9mdW5jdGlvbnNfYWZ0ZXJfQVRGIixjKTttLndoZW4oImEtZG9tcmVhZHkiKS5leGVjdXRlKCJmbHVzaF9xdWV1ZWRfZnVuY3Rpb25zX2FmdGVyX2RvbXJlYWR5IixmdW5jdGlvbigpe2QuZGVsYXkoaCw1MDApfSk7cmV0dXJue2V4ZWN1dGU6ZnVuY3Rpb24oYyl7ZT9nLmRlZmVyKGMpOmIucHVzaChjKX19fSk7InVzZSBzdHJpY3QiO20uZGVjbGFyZSgicHJ2OmEtaXMtdHlwZWRhcnJheS1zdXBwb3J0ZWQiLCEoIW4uQXJyYXlCdWZmZXJ8fCFuLlVpbnQ4QXJyYXkpKTttLndoZW4oImEtY2xhc3MiLCJwcnY6YS1pcy10eXBlZGFycmF5LXN1cHBvcnRlZCIpLnJlZ2lzdGVyKCJwcnY6YS1iaXQtYXJyYXkiLGZ1bmN0aW9uKGQsCmcpe2Z1bmN0aW9uIGsoYyl7cmV0dXJuIGZ1bmN0aW9uKGIsZSl7Ynw9MDtlPShlfDApKyhiLzg+PjApO2IlPTg7aWYoZTx0aGlzLmJ5dGVMZW5ndGgoKSlyZXR1cm4gYy5jYWxsKHRoaXMsYixlKX19dmFyIGM9ZC5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihjKXt0aGlzLl9iaXRzQnVmZmVyPWN9LGJ5dGVMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYml0c0J1ZmZlci5sZW5ndGh9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGM7dHJ5e2M9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHRoaXMuX2JpdHNCdWZmZXIpfWNhdGNoKGIpe2M9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFtdLnNsaWNlLmNhbGwodGhpcy5fYml0c0J1ZmZlcikpfXJldHVybiBjfSxzZXRCeXRlOmZ1bmN0aW9uKGMsYil7Ynw9MDtiPHRoaXMuX2JpdHNCdWZmZXIubGVuZ3RoJiYodGhpcy5fYml0c0J1ZmZlcltiXT1jKX0sZ2V0Qnl0ZTpmdW5jdGlvbihjKXtpZihjPHRoaXMuYnl0ZUxlbmd0aCgpKXJldHVybiB0aGlzLl9iaXRzQnVmZmVyW2NdfSwKc2V0OmsoZnVuY3Rpb24oYyxiKXt0aGlzLl9iaXRzQnVmZmVyW2JdfD0xPDxjfSksdW5zZXQ6ayhmdW5jdGlvbihjLGIpe3RoaXMuX2JpdHNCdWZmZXJbYl1ePXRoaXMuX2JpdHNCdWZmZXJbYl0mMTw8Y30pLGdldDprKGZ1bmN0aW9uKGMsYil7cmV0dXJuIHRoaXMuX2JpdHNCdWZmZXJbYl0mMTw8Yz8xOjB9KX0pO2MuY3JlYXRlPWZ1bmN0aW9uKGQpe3JldHVybiBjLmNyZWF0ZUJ5dGVMZW5ndGgoKGQtMSkvOCsxPj4wKX07Yy5jcmVhdGVCeXRlTGVuZ3RoPWZ1bmN0aW9uKGQpe3ZhciBiO2lmKGcpYj1uZXcgVWludDhBcnJheShkKTtlbHNlIGZvcihiPUFycmF5KGQpLC0tZDswPD1kO2QtLSliW2RdPTA7cmV0dXJuIG5ldyBjKGIpfTtjLmZyb21BcnJheT1mdW5jdGlvbihkKXtpZihnKWQ9bmV3IFVpbnQ4QXJyYXkoZCk7ZWxzZXtkPVtdLnNsaWNlLmNhbGwoZCk7Zm9yKHZhciBiPWQubGVuZ3RoLTE7MDw9YjtiLS0pMjU2PD1kW2JdJiYoZFtiXSU9MjU2KX1yZXR1cm4gbmV3IGMoZCl9OwpjLmZyb21TdHJpbmc9ZnVuY3Rpb24oZCl7Zm9yKHZhciBiPWQubGVuZ3RoLGU9QXJyYXkoYiksYj1iLTE7MDw9YjtiLS0pZVtiXT1kLmNoYXJDb2RlQXQoYik7cmV0dXJuIGMuZnJvbUFycmF5KGUpfTtyZXR1cm4gY30pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtdXRpbCIpLnJlZ2lzdGVyKCJwcnY6YS1jb29raWUtd3JpdGVyIixmdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oZyxrLGMpe3ZhciBoPVtdLGI7az1kLnRyaW0oayk7aWYoLTE8ay5pbmRleE9mKCciJyl8fC0xPGsuaW5kZXhPZigiXFwiKSlrPSciJytrLnJlcGxhY2UoLygifFxcKS9nLCJcXCQxIikrJyInO2M9Y3x8e307Yy5wYXRoJiZoLnB1c2goIjtwYXRoXHgzZCIrYy5wYXRoKTtjLmRvbWFpbiYmaC5wdXNoKCI7ZG9tYWluXHgzZCIrYy5kb21haW4pO2MubWF4QWdlJiZoLnB1c2goIjttYXgtYWdlXHgzZCIrYy5tYXhBZ2UpO2MuZXhwaXJlcyYmKGI9Yy5leHBpcmVzLGMuZXhwaXJlcy5nZXRUaW1lJiZjLmV4cGlyZXMudG9VVENTdHJpbmc/CmI9Yy5leHBpcmVzLnRvVVRDU3RyaW5nKCk6Im51bWJlciI9PT10eXBlb2YgYy5leHBpcmVzJiYoYj0obmV3IERhdGUoRGF0ZS5ub3coKSsxRTMqYy5leHBpcmVzKSkudG9VVENTdHJpbmcoKSksaC5wdXNoKCI7ZXhwaXJlc1x4M2QiK2IpKTtkb2N1bWVudC5jb29raWU9ZysiXHgzZCIraytoLmpvaW4oIiIpfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtdXRpbCIsInBydjphLWNvb2tpZS13cml0ZXIiLCJwcnY6YS1iaXQtYXJyYXkiLCJhLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNvb2tpZS1oaW50IixmdW5jdGlvbihkLGcsayxjKXtmdW5jdGlvbiBoKGIpe3JldHVybiBmdW5jdGlvbihjKXtnKGIsbi5idG9hKGMudG9TdHJpbmcoKSkse3BhdGg6Ii8iLGV4cGlyZXM6MzE1MzZFM30pfX1mdW5jdGlvbiBiKGIsYyl7dmFyIGE9OCpiLmJ5dGVMZW5ndGgoKS0xNjtyZXR1cm57c2V0OmQucmVzdChmdW5jdGlvbihlKXtkLmVhY2goZSxmdW5jdGlvbihjKXtjPj1hfHxiLnNldChjLDIpfSk7CmMoYik7cmV0dXJuIHRoaXN9KX19aWYoIW4uYnRvYXx8IW4uYXRvYilyZXR1cm57Z2V0OmMuY29uc3RhbnRzLk5PT1B9O3ZhciBlPXtzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LG09e307cmV0dXJue2dldDpmdW5jdGlvbihjLGcpe2lmKCFtW2NdKXt2YXIgYT1nfHwxMjA7Zz1oKGMpO3ZhciBxPWQuY29va2llcy5nZXQoYyl8fCIwIixmO2I6e2lmKCEoND5xLmxlbmd0aCkpdHJ5e3ZhciBsPW4uYXRvYihxKTtpZigwIT09bC5sZW5ndGgmJigxIT09bC5sZW5ndGh8fDAhPT1sLmNoYXJDb2RlQXQoMCkpKXtmPWsuZnJvbVN0cmluZyhsKTticmVhayBifX1jYXRjaCh4KXt9Zj12b2lkIDB9Znx8KGE9ay5jcmVhdGUoMTYrYSksZj1uZXcgRGF0ZSxsPW5ldyBEYXRlKGYuZ2V0RnVsbFllYXIoKSwwLDApLGY9TWF0aC5mbG9vcigoZi1sKS84NjRFNSkvMj4+MCxhLnNldEJ5dGUoMCwwKSxhLnNldEJ5dGUoZiwxKSxnKGEpLGY9YSk7YT1mO2c9MD49KGEuZ2V0Qnl0ZSgwKSY2Myk/YihhLApnKTplO21bY109Z31yZXR1cm4gbVtjXX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiQSIpLnJlZ2lzdGVyKCJhLWNvbXBvbmVudC1taXhpbnMiLGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGcoaCl7Zm9yKHZhciBiPTA7YjxoLmxlbmd0aDtiKyspaWYoMD5kLmluZGV4T2ZBcnJheShjLGhbYl0pKXJldHVybiExO3JldHVybiEwfXZhciBrPTAsYz1kLmNvbnN0YW50cy5kZWNsYXJhdGl2ZUV2ZW50cy5zcGxpdCgiICIpO3JldHVybntzaG93OmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImEtaGlkZGVuIGFvay1oaWRkZW4iKS5zaG93KCk7cmV0dXJuIHRoaXN9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5hZGRDbGFzcygiYW9rLWhpZGRlbiIpO3JldHVybiB0aGlzfSx0b2dnbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fJGVsZW1lbnQuaGFzQ2xhc3MoImFvay1oaWRkZW4iKT90aGlzLnNob3coKTp0aGlzLmhpZGUoKX0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8kZWxlbWVudC5zaXplKCl9LAppc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl8kZWxlbWVudC5zaXplKCl9LG9uOmZ1bmN0aW9uKGMsYil7dmFyIGU9ZC5wYXJzZUZ1bmN0aW9uTmFtZShiKTtlfHxtLmVycm9yLmNhbGwoe30sIlBsZWFzZSBuYW1lIGFsbCBhc3luY2hyb25vdXMgZXZlbnQgY2FsbGJhY2tzIik7aWYoYz1jP2Muc3BsaXQoIiAiKTp2b2lkIDApe3RoaXMuZm5NYXA9dGhpcy5mbk1hcHx8e307ZyhjKXx8bS5lcnJvci5jYWxsKHt9LCJUaGF0IGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQhIik7dmFyIHA9dGhpcztkLmVhY2goYyxmdW5jdGlvbihjKXt0aGlzLmZuTWFwW2NdPXRoaXMuZm5NYXBbY118fFtdO3ZhciBoPXRoaXMuZm5NYXBbY11bYl09ImEtY29tcG9uZW50LWV2ZW50LSIraysrO2QuZGVjbGFyYXRpdmUoaCxjLGZ1bmN0aW9uKCl7dHJ5e2IuYXBwbHkocCxwLmNhbGxiYWNrQXJnc3x8W10pfWNhdGNoKGEpe20ubG9nRXJyb3IuY2FsbCh7fSxhLCJFcnJvciBvY2N1cnJlZCBpbiBhbiBhc3luY2hyb25vdXMgZXZlbnQgY2FsbGJhY2siLAoiRkFUQUwiLChiLmNhbGxlcnx8IiIpK2MrImhhbmRsZXI6IisoZXx8ImFub255bW91cyIpKX19KTtkLmRlY2xhcmF0aXZlLmNyZWF0ZShwLl8kZWxlbWVudCxoKX0scCl9fSxvZmY6ZnVuY3Rpb24oYyxiKXtjPWM/Yy5zcGxpdCgiICIpOnZvaWQgMDt0aGlzLmZuTWFwfHxtLmVycm9yLmNhbGwoe30sIlRoZXJlIGFyZSBubyBjYWxsYmFja3MgYXNzaWduZWQgdG8gdGhpcyBjb21wb25lbnQiKTtjJiZiP2QuZWFjaChjLGZ1bmN0aW9uKGMpe3RyeXtkLmRlY2xhcmF0aXZlLnJlbW92ZSh0aGlzLl8kZWxlbWVudCx0aGlzLmZuTWFwW2NdW2JdKSxkZWxldGUgdGhpcy5mbk1hcFtjXVtiXX1jYXRjaChoKXttLmVycm9yLmNhbGwoe30sIlRoZSBjb21wb25lbnQgaXMgbm90IGJvdW5kIHRvIGEgY2FsbGJhY2sgd2l0aCBuYW1lICIrZC5wYXJzZUZ1bmN0aW9uTmFtZShiKXx8ImFub255bW91cyBmb3IgZXZlbnQgIitjKX19LHRoaXMpOmJ8fGM/IWImJmM/ZC5lYWNoKGMsZnVuY3Rpb24oYil7Zm9yKHZhciBjIGluIHRoaXMuZm5NYXBbYl0pdGhpcy5mbk1hcFtiXS5oYXNPd25Qcm9wZXJ0eShjKSYmCnRoaXMub2ZmKGIsYyk7ZGVsZXRlIHRoaXMuZm5NYXBbYl19LHRoaXMpOm0uZXJyb3IuY2FsbCh7fSwiUGxlYXNlIHByb3ZpZGUgYW4gZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsYmFjayIpOihkLmRlY2xhcmF0aXZlLnJlbW92ZSh0aGlzLl8kZWxlbWVudCksZGVsZXRlIHRoaXMuZm5NYXApfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsYil7dGhpcy5jYWxsYmFja0FyZ3M9Ynx8W107ZC4kLmZuLnRyaWdnZXIuY2FsbCh0aGlzLl8kZWxlbWVudCxjKX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiQSIsImEtY29tcG9uZW50LW1peGlucyIsImEtYW5hbHl0aWNzIiwicHJ2OmEtc2FtcGxlciIpLnJlZ2lzdGVyKCJhLWNvbXBvbmVudCIsZnVuY3Rpb24oZCxnLGssYyl7dmFyIGg9ZC5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihiLGMpe2QuY29udGFpbnMoYiwiLmEtIikmJm0uZXJyb3IoIntBUEl9IENhbm5vdCBjcmVhdGUgY29tcG9uZW50cyB1c2luZyAnYS0nIHNlbGVjdG9ycy4gQXBwbHkgeW91ciBvd24gQ1NTIGNsYXNzIG9yIElEIHRvIHNlbGVjdCB0aGlzIGVsZW1lbnQuIiwKIkFQSSIsImNvbXBvbmVudCIpO3RoaXMuXyRlbGVtZW50PWQuJChiLGMpO3RoaXMuX3RyYWNrQXBpKCl9LF90cmFja0FwaTpmdW5jdGlvbigpe3RoaXMuX2NvbXBvbmVudE5hbWUmJmMoIkFVSSBBUEkgQW5hbHl0aWNzIikmJmsuaW5jcmVtZW50KCJhcGk6Iit0aGlzLl9jb21wb25lbnROYW1lKX19KTtyZXR1cm57Y3JlYXRlOmZ1bmN0aW9uKGIpe3ZhciBjPWIubWl4aW47YyYmZGVsZXRlIGIubWl4aW47Yj1oLmV4dGVuZChiKTtjJiZkLm1peGluKGIucHJvdG90eXBlLGcsYyk7cmV0dXJuIGJ9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiLCJhLWNvbXBvbmVudCIpLnJlZ2lzdGVyKCJhLWFsZXJ0IixmdW5jdGlvbihkLGcpe3ZhciBrPWQuJCxjPVsiZXJyb3IiLCJzdWNjZXNzIiwid2FybmluZyIsImluZm8iXSxoPWQubWFwKGMsZnVuY3Rpb24oYil7cmV0dXJuImEtYWxlcnQtIitifSkuam9pbigiICIpLGI9ZC5tYXAoYyxmdW5jdGlvbihiKXtyZXR1cm4iYS1hbGVydC1pbmxpbmUtIisKYn0pLmpvaW4oIiAiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImg0Iik7ZS5jbGFzc05hbWU9ImEtYWxlcnQtaGVhZGluZyI7dmFyIHA9ayhlKSxuPWcuY3JlYXRlKHtfY29tcG9uZW50TmFtZToiYWxlcnQiLGluaXQ6ZnVuY3Rpb24oYixhKXt0aGlzLl9zdXBlcihiLGEpO3RoaXMuXyRlbGVtZW50PXRoaXMuXyRlbGVtZW50LmZpbHRlcigiLmEtYWxlcnQsIC5hLWFsZXJ0LWlubGluZSIpO3RoaXMuXyRoZWFkaW5nPXRoaXMuXyRlbGVtZW50LmZpbmQoIi5hLWFsZXJ0LWhlYWRpbmciKTt0aGlzLl8kY29udGVudD10aGlzLl8kZWxlbWVudC5maW5kKCIuYS1hbGVydC1jb250ZW50Iil9LG1peGluOlsic2hvdyIsImhpZGUiLCJzaXplIiwiaXNFbXB0eSJdLGhlYWRpbmc6ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYilyZXR1cm4gdGhpcy5fJGhlYWRpbmcudGV4dCgpO3RoaXMuXyRoZWFkaW5nLmxlbmd0aD90aGlzLl8kaGVhZGluZy50ZXh0KGIpOnRoaXMuXyRoZWFkaW5nPQpwLmNsb25lKCkudGV4dChiKS5pbnNlcnRCZWZvcmUodGhpcy5fJGNvbnRlbnQpO3JldHVybiB0aGlzfSxyZW1vdmVIZWFkaW5nOmZ1bmN0aW9uKCl7dGhpcy5fJGhlYWRpbmcucmVtb3ZlKCk7dGhpcy5fJGhlYWRpbmc9aygpO3JldHVybiB0aGlzfSx0ZXh0OmZ1bmN0aW9uKGIpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGIpcmV0dXJuIHRoaXMuXyRjb250ZW50LnRleHQoKTt0aGlzLl8kY29udGVudC50ZXh0KGIpO3JldHVybiB0aGlzfSxodG1sOmZ1bmN0aW9uKGIpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGIpcmV0dXJuIHRoaXMuXyRjb250ZW50Lmh0bWwoKTt0aGlzLl8kY29udGVudC5odG1sKGIpO3JldHVybiB0aGlzfSx0eXBlOmZ1bmN0aW9uKGUpey0xPT09ZC5pbmRleE9mQXJyYXkoYyxlKSYmbS5lcnJvcigie0FQSX0gQWxlcnQgdHlwZSBtdXN0IGJlIG9uZSBvZiBbZXJyb3IsIHN1Y2Nlc3MsIHdhcm5pbmcsIGluZm9dLiIsIkFQSSIsImFsZXJ0Iik7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbihhLApjKXthPWsoYyk7Yz0iYS1hbGVydC0iO2EuaGFzQ2xhc3MoImEtYWxlcnQtaW5saW5lIik/KGMrPSJpbmxpbmUtIixhLnJlbW92ZUNsYXNzKGIpKTphLnJlbW92ZUNsYXNzKGgpO2EuYWRkQ2xhc3MoYytlKX0pO3JldHVybiB0aGlzfX0pO3JldHVybiBmdW5jdGlvbihiLGEpe3JldHVybiBuZXcgbihiLGEpfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiLCJhLWNvbXBvbmVudCIsImEtZm9ybS1jb250cm9scy1hcGkiKS5yZWdpc3RlcigiYS1jaGVja2JveCIsZnVuY3Rpb24oZCxnLGspe3ZhciBjPWQuJCxoPWsuc2V0Q2hlY2tib3hTdGF0ZSxiPWcuY3JlYXRlKHtfY29tcG9uZW50TmFtZToiY2hlY2tib3giLGluaXQ6ZnVuY3Rpb24oYixjKXt0aGlzLl9zdXBlcihiLGMpO3RoaXMuXyRlbGVtZW50PXRoaXMuXyRlbGVtZW50LmNsb3Nlc3QoIi5hLWNoZWNrYm94Iik7dGhpcy5fJGlucHV0PXRoaXMuXyRlbGVtZW50LmZpbmQoIlt0eXBlXHgzZGNoZWNrYm94XSIpfSxtaXhpbjpbInNob3ciLAoiaGlkZSIsInNpemUiLCJpc0VtcHR5Il0sY2hlY2s6ZnVuY3Rpb24oYil7Yj12b2lkIDA9PT1iPyEwOmI7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbigpe2godGhpcyxiKX0pO3JldHVybiB0aGlzfSx1bmNoZWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hlY2soITEpfSx0b2dnbGVDaGVja2VkOmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbigpe2sudG9nZ2xlQ2hlY2tib3hTdGF0ZSh0aGlzKX0pO3JldHVybiB0aGlzfSxpc0NoZWNrZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPXRoaXMuXyRpbnB1dC5sZW5ndGg7YjxjO2IrKylpZighdGhpcy5fJGlucHV0W2JdLmNoZWNrZWQpcmV0dXJuITE7cmV0dXJuITB9LGlzVW5jaGVja2VkOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsYz10aGlzLl8kaW5wdXQubGVuZ3RoO2I8YztiKyspaWYodGhpcy5fJGlucHV0W2JdLmNoZWNrZWQpcmV0dXJuITE7cmV0dXJuITB9LGVuYWJsZTpmdW5jdGlvbihiKXtiPXZvaWQgMD09PQpiPyEwOmI7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbigpe2godGhpcyx2b2lkIDAsIWIpfSk7cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGUoITEpfSx0b2dnbGVFbmFibGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsYz10aGlzLl8kaW5wdXQubGVuZ3RoO2I8YztiKyspaCh0aGlzLl8kZWxlbWVudFtiXSx2b2lkIDAsIXRoaXMuXyRpbnB1dFtiXS5kaXNhYmxlZCk7cmV0dXJuIHRoaXN9LGlzRW5hYmxlZDpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGM9dGhpcy5fJGlucHV0Lmxlbmd0aDtiPGM7YisrKWlmKHRoaXMuXyRpbnB1dFtiXS5kaXNhYmxlZClyZXR1cm4hMTtyZXR1cm4hMH0saXNEaXNhYmxlZDpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGM9dGhpcy5fJGlucHV0Lmxlbmd0aDtiPGM7YisrKWlmKCF0aGlzLl8kaW5wdXRbYl0uZGlzYWJsZWQpcmV0dXJuITE7cmV0dXJuITB9LHRvZ2dsZTpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYiYmKGI9ISFiKTt0aGlzLl8kZWxlbWVudC5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS50b2dnbGUoYil9KTtyZXR1cm4gdGhpc319KTtyZXR1cm4gZnVuY3Rpb24oYyxkKXtyZXR1cm4gbmV3IGIoYyxkKX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJBIiwiYS1jb21wb25lbnQiKS5yZWdpc3RlcigiYS1tZXRlciIsZnVuY3Rpb24oZCxnKXt2YXIgaz1nLmNyZWF0ZSh7X2NvbXBvbmVudE5hbWU6Im1ldGVyIixpbml0OmZ1bmN0aW9uKGMsZCl7dGhpcy5fc3VwZXIoYyxkKTt0aGlzLl8kZWxlbWVudD10aGlzLl8kZWxlbWVudC5maWx0ZXIoIi5hLW1ldGVyLCAuYS1tZXRlci13aXRoLXR4dCIpO3RoaXMuXyRiYXI9dGhpcy5fJGVsZW1lbnQuZmluZCgiLmEtbWV0ZXItYmFyIik7dGhpcy5fJHByb2dyZXNzVHh0PXRoaXMuXyRlbGVtZW50LmZpbmQoIi5hLW1ldGVyLXByb2dyZXNzLXR4dCIpfSxtaXhpbjpbInNob3ciLCJoaWRlIiwic2l6ZSIsImlzRW1wdHkiXSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57cGVyY2VudDp0aGlzLnBlcmNlbnQoKSwKdHh0OnRoaXMudGV4dCgpfX0sZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImEtaW5hY3RpdmUiKTtyZXR1cm4gdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuXyRlbGVtZW50LmFkZENsYXNzKCJhLWluYWN0aXZlIik7cmV0dXJuIHRoaXN9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiF0aGlzLl8kZWxlbWVudC5oYXNDbGFzcygiYS1pbmFjdGl2ZSIpfSxwZXJjZW50OmZ1bmN0aW9uKGMpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGMpcmV0dXJuIGM9dGhpcy5fJGJhci5nZXQoMCkuc3R5bGUud2lkdGgscGFyc2VJbnQoYywxMCk7ZC5pc0Zpbml0ZU51bWJlcihjKXx8bS5lcnJvcigie0FQSX0gIE1ldGVyIHBlcmNlbnQgc2hvdWxkIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwIiwiYS1tZXRlciIsInNldFByb2dyZXNzIik7Yz1NYXRoLm1pbigxMDAsTWF0aC5tYXgoMCxjKSk7Yys9IiUiO3RoaXMuXyRiYXIuY3NzKHt3aWR0aDpjfSk7CnRoaXMuXyRlbGVtZW50LmF0dHIoImFyaWEtbGFiZWwiLGMpO3JldHVybiB0aGlzfSx0ZXh0OmZ1bmN0aW9uKGMpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGMpcmV0dXJuIHRoaXMuXyRwcm9ncmVzc1R4dC50ZXh0KCk7dGhpcy5fJHByb2dyZXNzVHh0LnRleHQoYyk7cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihjLGQpe3RoaXMucGVyY2VudChjKTtkJiZ0aGlzLnRleHQoZCk7cmV0dXJuIHRoaXN9fSk7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7cmV0dXJuIG5ldyBrKGMsZCl9fSk7bS53aGVuKCJhLWNvbXBvbmVudCIpLnJlZ2lzdGVyKCJhLXNwaW5uZXIiLGZ1bmN0aW9uKGQpe3ZhciBnPWQuY3JlYXRlKHtfY29tcG9uZW50TmFtZToic3Bpbm5lciIsaW5pdDpmdW5jdGlvbihkLGMpe3RoaXMuX3N1cGVyKGQsYyk7dGhpcy5fJGVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuZmlsdGVyKCIuYS1zcGlubmVyLXdyYXBwZXIsIC5hLXNwaW5uZXIiKX0sbWl4aW46WyJzaG93IiwiaGlkZSIsImlzRW1wdHkiLAoic2l6ZSJdLHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuXyRlbGVtZW50LnJlbW92ZSgpfX0pO3JldHVybiBmdW5jdGlvbihkLGMpe3JldHVybiBuZXcgZyhkLGMpfX0pOyJ1c2Ugc3RyaWN0IjttLnJlZ2lzdGVyKCJhLXVhIixmdW5jdGlvbigpe3JldHVybntjb21wYXJlVmVyc2lvbnM6ZnVuY3Rpb24oZCxnLGspe3ZhciBjPWZ1bmN0aW9uKGIpe20uZXJyb3IoIlZlcnNpb25zIGFyZSBub3QgY29tcGFyYWJsZS4gIitiLCJBIC0gZXh0cmFzIiwiY29tcGFyZVZlcnNpb25zIil9O2s9a3x8Ii4iOyJzdHJpbmciPT09dHlwZW9mIGQmJiJzdHJpbmciPT09dHlwZW9mIGcmJiJzdHJpbmciPT09dHlwZW9mIGsmJiIiIT09ZCYmIiIhPT1nfHxjKCJJbnB1dCB2YWx1ZXMgYXJlIG5vdCB2YWxpZC4iKTtkPWQuc3BsaXQoayk7Zz1nLnNwbGl0KGspO2s9TWF0aC5tYXgoZC5sZW5ndGgsZy5sZW5ndGgpO2Zvcih2YXIgaD0wO2g8aztoKyspe3ZhciBiPWg8ZC5sZW5ndGg/TnVtYmVyKGRbaF0pOjAsZT0KaDxnLmxlbmd0aD9OdW1iZXIoZ1toXSk6MDshaXNOYU4oYikmJmlzRmluaXRlKGIpJiYhaXNOYU4oZSkmJmlzRmluaXRlKGUpfHxjKCJQaWVjZSBvZiBvbmUgdmVyc2lvbiBudW1iZXIgZXZhbHVhdGVzIHRvIE5hTiBvciArLy0gSW5maW5pdHkuIik7aWYoYjxlKXJldHVybi0xO2lmKGI+ZSlyZXR1cm4gMX1yZXR1cm4gMH19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiYS1iYXNlIiwiYS11dGlsIiwiYS1hbmFseXRpY3MiLCJhZnRlckxvYWQiKS5leGVjdXRlKCJhLXRlbXBsYXRlLWVycm9ycyIsZnVuY3Rpb24oZCxnLGspe3ZhciBjPWQuJCxoPXt9OyhmdW5jdGlvbigpe2MoIi5hLXRlbXBsYXRlLWVycm9ycyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1jKHRoaXMpOyhiPWIuZGF0YSgidGVtcGxhdGUtZXJyb3JzIil8fGIuZmluZCgiW2RhdGEtdGVtcGxhdGUtZXJyb3JzXSIpLmRhdGEoInRlbXBsYXRlLWVycm9ycyIpKSYmMDxiLmxlbmd0aCYmZy5lYWNoKGIsZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI6Iikuc2xpY2UoMCwKMykuam9pbigiOiIpO2hbYl18fChoW2JdPTApO2hbYl0rPTF9KX0pfSkoKTsoZnVuY3Rpb24oKXtnLmVhY2goaCxmdW5jdGlvbihiLGMpe3ZhciBkPWMuc3BsaXQoIjoiKTtiPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coYikvTWF0aC5sb2coMTApKSk7ay5sb2dFcnJvcihkWzFdKyIgYXR0cmlidXRlIGZhaWxlZCAiK2RbMl0rIiBpbiAiK2RbMF0rIiB0ZW1wbGF0ZS4gVGhpcyBlcnJvciBpcyB0aHJvd24gYmV0d2VlbiAiK2IrIiBhbmQgIisxMCpiKyIgbnVtYmVyIG9mIHRpbWVzIG9uIHRoZSBwYWdlLiIsIkVSUk9SIixjKX0pfSkoKX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtYW5hbHl0aWNzIiwicHJ2OnAtZGVidWciLCJyZWFkeSIpLmV4ZWN1dGUoZnVuY3Rpb24oZCxnKXttLmRlY2xhcmUoInBydjphLWxvZ1RyaWdnZXIiLGZ1bmN0aW9uKGspe3ZhciBjPWdba10mJmdba10ucmVnaXN0ZXJlZHx8MCxoPTAsYj0wLGU7Zm9yKGUgaW4gZylpZihnLmhhc093blByb3BlcnR5KGUpKXt2YXIgbT0KZ1tlXTttLmVuZCYmbS5lbmQ8PWMmJihoKyssYis9bS5lbmQtbS5zdGFydCl9ZC5jb3VudCgiYmxvY2tpbmctY291bnQ6IitrLGgpO2QuY291bnQoImJsb2NraW5nLXRpbWU6IitrLE1hdGgucm91bmQoYikpfSl9KTsidXNlIHN0cmljdCI7bS53aGVuKCJqUXVlcnkiLCJhLWFuYWx5dGljcyIsImxvYWQiKS5yZWdpc3RlcigiYS11bmljb2RlLXJ1cGVlLXRlc3QiLGZ1bmN0aW9uKGQsZyl7dmFyIGs9ZCgiXHgzY2Rpdi9ceDNlIiksYz1kKCJceDNjc3Bhbi9ceDNlIikuaHRtbCgiXHgyNiM2NTUzNDsiKTtkPWQoIlx4M2NzcGFuL1x4M2UiKS5odG1sKCJceDI2IzgzNzc7Iik7ay5hcHBlbmQoYyxkKTtrLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO2Q9ZC53aWR0aCgpO2M9Yy53aWR0aCgpO2Q9PT1jP2cuaW5jcmVtZW50KCJhdWktdW5zdXBwb3J0ZWQtcnVwZWUiLDEpOmcuaW5jcmVtZW50KCJhdWktc3VwcG9ydGVkLXJ1cGVlIiwxKTtrLnJlbW92ZSgpfSk7InVzZSBzdHJpY3QiO20ucmVnaXN0ZXIoInBydjphLXNhbXBsZXItaW5jbHVzaW9uIiwKZnVuY3Rpb24oKXtyZXR1cm57IkFVSSBBUEkgQW5hbHl0aWNzIjouMDE+TWF0aC5yYW5kb20oKX19KTttLndoZW4oInBydjphLXNhbXBsZXItaW5jbHVzaW9uIikucmVnaXN0ZXIoInBydjphLXNhbXBsZXIiLGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihnKXtyZXR1cm4gZC5oYXNPd25Qcm9wZXJ0eShnKSYmZFtnXX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJBIiwibG9hZCIpLmV4ZWN1dGUoImEtZW1iZXIiLGZ1bmN0aW9uKGQpeyFkLmNhcGFiaWxpdGllcy5pc1VDQnJvd3NlciYmZC5sb2NhbFN0b3JhZ2UmJiJhLWVtYmVyIiE9PWQubG9jYWxTdG9yYWdlLmdldEl0ZW0oImEtZm9udC1jbGFzcyIpJiZtLndoZW4oImEtZm9udHMiKS5leGVjdXRlKCJhLWVtYmVyLWxvYWRlciIsZnVuY3Rpb24oZyl7Zy5sb2FkKCIxZW0gQW1hem9uIEVtYmVyIik7Zy5sb2FkKCJib2xkIDFlbSBBbWF6b24gRW1iZXIiKTtnLmxvYWQoIml0YWxpYyAxZW0gQW1hem9uIEVtYmVyIik7Zy5sb2FkKCJpdGFsaWMgYm9sZCAxZW0gQW1hem9uIEVtYmVyIik7CmcucmVhZHkudGhlbihmdW5jdGlvbihnKXtkLmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhLWZvbnQtY2xhc3MiLCJhLWVtYmVyIil9KX0pfSk7InVzZSBzdHJpY3QiO20ud2hlbigibG9hZCIpLnJlZ2lzdGVyKCJhLXBjdiIsZnVuY3Rpb24oKXt2YXIgZD0obi5wY3Z8fHt9KS5BbWF6b25VSTtkJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLWF1aS12ZXJzaW9uIixkKX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiLCJhLWFuYWx5dGljcyIpLnJlZ2lzdGVyKCJwcnY6YS1hc3NldC10cmFuc2ZlciIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKGIsYyxkKXtyZXR1cm4oYj1iLmV4ZWMoYykpJiYyPD1iLmxlbmd0aD9iWzFdOmR8fCIifWZ1bmN0aW9uIGMoKXtyZXR1cm4gZC5maWx0ZXIobi5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzKHtlbnRyeVR5cGU6InJlc291cmNlIn0pLGZ1bmN0aW9uKGIpe3JldHVybigibGluayI9PT1iLmluaXRpYXRvclR5cGV8fCJzY3JpcHQiPT09CmIuaW5pdGlhdG9yVHlwZSkmJmIubmFtZSYmMDxiLm5hbWUuaW5kZXhPZigiQVVJQ2xpZW50cy9BbWF6b25VSSIpfSl9dmFyIGg9L0FVSUNsaWVudHNcLyguKj8oPz0oPzojKXwkKSkvLGI9biYmbi5wZXJmb3JtYW5jZSYmbi5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzJiYiZnVuY3Rpb24iPT09dHlwZW9mIG4ucGVyZm9ybWFuY2UuZ2V0RW50cmllcztyZXR1cm4gZnVuY3Rpb24oKXtiJiZkLmVhY2goYygpLGZ1bmN0aW9uKGIpe3ZhciBjO2M9W2IuaW5pdGlhdG9yVHlwZSxrKGgsYi5uYW1lfHwiIildLmpvaW4oIjoiKTtnLmNvdW50KGMrIjpzdGFydFRpbWUiLGIuc3RhcnRUaW1lfHwwKTtnLmNvdW50KGMrIjpyZXNwb25zZUVuZCIsYi5yZXNwb25zZUVuZHx8MCl9KX19KTttLndoZW4oInBydjphLWFzc2V0LXRyYW5zZmVyIikuZXhlY3V0ZSgiYS1hc3NldC10cmFuc2Zlci10aW1lIixmdW5jdGlvbihkKXsuMDU+TWF0aC5yYW5kb20oKSYmZCgpfSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGMpe3ZhciBmPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsaD1mLl9uYW1lc3BhY2V8fGYuYXR0cmlidXRlRXJyb3JzLGQ9aD9oKCJBbWF6b25VSUJ1dHRvbiIsIkFtYXpvblVJIik6ZjtkLmd1YXJkRmF0YWw/ZC5ndWFyZEZhdGFsKGMpKGQsd2luZG93KTpkLmV4ZWN1dGUoZnVuY3Rpb24oKXtjKGQsd2luZG93KX0pfSkoZnVuY3Rpb24oYyxmLGgpe2Mud2hlbigiQSIsImEtY29tcG9uZW50IikucmVnaXN0ZXIoImEtYnV0dG9uIixmdW5jdGlvbihkLGwpe2Z1bmN0aW9uIGUoYSl7YS5wcmV2ZW50RGVmYXVsdCgpfXZhciBnPWwuY3JlYXRlKHtfY29tcG9uZW50TmFtZToiYnV0dG9uIixpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fc3VwZXIoYSxiKTt0aGlzLl8kZWxlbWVudD10aGlzLl8kZWxlbWVudC5maWx0ZXIoIi5hLWJ1dHRvbiIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuY2hpbGRyZW4oIi5hLWJ1dHRvbi1pbm5lciIpLmNoaWxkcmVuKCJidXR0b24saW5wdXQiKTsKdGhpcy5fJGNvcmVMaW5rRWxlbWVudD10aGlzLl8kZWxlbWVudC5jaGlsZHJlbigiLmEtYnV0dG9uLWlubmVyIikuY2hpbGRyZW4oImEiKTt0aGlzLl8kY29udGVudEVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuZmluZCgiLmEtYnV0dG9uLXRleHQiKX0sbWl4aW46InNob3cgaGlkZSB0b2dnbGUgaXNFbXB0eSBzaXplIG9uIG9mZiB0cmlnZ2VyIi5zcGxpdCgiICIpLGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuXyRlbGVtZW50LnJlbW92ZUNsYXNzKCJhLWJ1dHRvbi1kaXNhYmxlZCIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQucHJvcCgiZGlzYWJsZWQiLCExKTt0aGlzLl8kY29yZUxpbmtFbGVtZW50LnVuYmluZCgiY2xpY2siLGUpO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQuYWRkQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImEtYnV0dG9uLWZvY3VzIik7dGhpcy5fJGNvcmVGb3JtRWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsCiEwKTt0aGlzLl8kY29yZUxpbmtFbGVtZW50LmNsaWNrKGUpO3JldHVybiB0aGlzfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fJGVsZW1lbnQuaGFzQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIil9LHNldFN0YXR1czpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl8kZWxlbWVudCxlPVtudWxsLCJub3JtYWwiLCJzZWxlY3RlZCIsImRpc2FibGVkIiwiZXJyb3IiLCJpbmFjdGl2ZSJdLGs9MD5kLmluZGV4T2ZBcnJheShlLGEpLG09InJhZGlvIj09PWIuYXR0cigicm9sZSIpO2lmKGspcmV0dXJuIGMuZXJyb3IoYSsiIGlzIG5vdCBhIHZhbGlkIHN0YXR1cyIpLCExO2QuZWFjaChlLGZ1bmN0aW9uKGEpe2IucmVtb3ZlQ2xhc3MoImEtYnV0dG9uLSIrYSl9KTt0aGlzLl8kY29yZUZvcm1FbGVtZW50LnByb3AoImRpc2FibGVkIiwiZGlzYWJsZWQiPT09YSk7Yi5hdHRyKCJhcmlhLWNoZWNrZWQiLGZ1bmN0aW9uKGIsayl7cmV0dXJuIG0/InNlbGVjdGVkIj09PWE6a30pO251bGwhPT0KYSYmYi5hZGRDbGFzcygiYS1idXR0b24tIithKTtyZXR1cm4gdGhpc30sdGV4dDpmdW5jdGlvbihhKXtpZighKDE+dGhpcy5fJGNvbnRlbnRFbGVtZW50Lmxlbmd0aCkpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGEpcmV0dXJuIHRoaXMuXyRjb250ZW50RWxlbWVudC50ZXh0KCk7dGhpcy5fJGNvbnRlbnRFbGVtZW50LnRleHQoYSk7cmV0dXJuIHRoaXN9fX0pO3JldHVybiBmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZyhhLGIpfX0pOyJ1c2Ugc3RyaWN0IjtjLndoZW4oIkEiLCJhLWNvbXBvbmVudCIpLnJlZ2lzdGVyKCJhLXRvZ2dsZS1idXR0b24iLGZ1bmN0aW9uKGQsYyl7ZnVuY3Rpb24gZShhKXthLnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gZyhhKXtkLmVhY2goYixmdW5jdGlvbihiKXthLl8kZWxlbWVudC5yZW1vdmVDbGFzcyhiKX0sYSl9ZnVuY3Rpb24gYShhKXtyZXR1cm4gMD09PWEuXyRlbGVtZW50Lmxlbmd0aHx8MD09PWEuXyRjb3JlRm9ybUVsZW1lbnQubGVuZ3RofQp2YXIgYj1bImEtYnV0dG9uLXNlbGVjdGVkIiwiYS1idXR0b24tZm9jdXMiXSxmPWMuY3JlYXRlKHtfY29tcG9uZW50TmFtZToidG9nZ2xlQnV0dG9uIixpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fc3VwZXIoYSxiKTt0aGlzLl8kZWxlbWVudD10aGlzLl8kZWxlbWVudC5maWx0ZXIoIi5hLWJ1dHRvbiIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuZmluZCgiLmEtYnV0dG9uLWlubmVyIikuZmluZCgiYnV0dG9uLGlucHV0Iik7dGhpcy5fJGNvcmVMaW5rRWxlbWVudD10aGlzLl8kZWxlbWVudC5maW5kKCIuYS1idXR0b24taW5uZXIgYSIpfSxuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXyRjb3JlRm9ybUVsZW1lbnQuYXR0cigibmFtZSIpfSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5yZW1vdmVDbGFzcygiYS1idXR0b24tZGlzYWJsZWQiKTt0aGlzLl8kY29yZUZvcm1FbGVtZW50LnByb3AoImRpc2FibGVkIiwhMSk7dGhpcy5fJGNvcmVMaW5rRWxlbWVudC51bmJpbmQoImNsaWNrIiwKZSk7cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtnKHRoaXMpO3RoaXMuXyRlbGVtZW50LmFkZENsYXNzKCJhLWJ1dHRvbi1kaXNhYmxlZCIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQucHJvcCgiZGlzYWJsZWQiLCEwKTt0aGlzLl8kY29yZUxpbmtFbGVtZW50LmNsaWNrKGUpO3JldHVybiB0aGlzfSxzZXRBdmFpbGFibGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5yZW1vdmVDbGFzcygiYS1idXR0b24tdW5hdmFpbGFibGUiKTtyZXR1cm4gdGhpc30sc2V0VW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5hZGRDbGFzcygiYS1idXR0b24tdW5hdmFpbGFibGUiKTtyZXR1cm4gdGhpc30saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWEodGhpcykmJiF0aGlzLl8kZWxlbWVudC5oYXNDbGFzcygiYS1idXR0b24tZGlzYWJsZWQiKX0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oKXshYSh0aGlzKSYmdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5fJGVsZW1lbnQuYWRkQ2xhc3MoImEtYnV0dG9uLXNlbGVjdGVkIGEtYnV0dG9uLWZvY3VzIikuYXR0cigiYXJpYS1jaGVja2VkIiwKInRydWUiKTtyZXR1cm4gdGhpc30sc2V0VW5zZWxlY3RlZDpmdW5jdGlvbigpe2codGhpcyk7cmV0dXJuIHRoaXN9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hYSh0aGlzKSYmdGhpcy5fJGVsZW1lbnQuaGFzQ2xhc3MoImEtYnV0dG9uLXNlbGVjdGVkIil9LGlzQXZhaWxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIWEodGhpcykmJiF0aGlzLl8kZWxlbWVudC5oYXNDbGFzcygiYS1idXR0b24tdW5hdmFpbGFibGUiKX19KTtyZXR1cm4gZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGYoYSxiKX19KTsidXNlIHN0cmljdCI7Yy53aGVuKCJBIiwiYS1jb21wb25lbnQiLCJhLXRvZ2dsZS1idXR0b24iKS5yZWdpc3RlcigiYS10b2dnbGUtYnV0dG9uLWdyb3VwIixmdW5jdGlvbihkLGMsZSl7dmFyIGY9Yy5jcmVhdGUoe19jb21wb25lbnROYW1lOiJ0b2dnbGVCdXR0b25Hcm91cCIsaW5pdDpmdW5jdGlvbihhLGIpe3RoaXMuX3N1cGVyKGEsYik7dGhpcy5fJHRvZ2dsZUdyb3VwRWxlbWVudD0KdGhpcy5fJGVsZW1lbnQuZmlsdGVyKCIuYS1idXR0b24tZ3JvdXAsIC5hLWJ1dHRvbi10b2dnbGUtZ3JvdXAiKS5lcSgwKTt0aGlzLl8kdG9nZ2xlR3JvdXBOYW1lPShhPXRoaXMuXyR0b2dnbGVHcm91cEVsZW1lbnQuZGF0YSgiYS1idXR0b24tZ3JvdXAiKSk/YS5uYW1lOnZvaWQgMH0sbmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8kdG9nZ2xlR3JvdXBOYW1lfSxnZXRUb2dnbGVCdXR0b25CeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0VG9nZ2xlQnV0dG9uQnlTZWxlY3RvcigiLmEtYnV0dG9uOmhhcyhbbmFtZVx4M2QiK2ErIl0pIil9LHNldFNlbGVjdGVkOmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRUb2dnbGVCdXR0b25CeVNlbGVjdG9yKGEpO2EuaXNFbmFibGVkKCkmJih0aGlzLmdldFNlbGVjdGVkKCkuc2V0VW5zZWxlY3RlZCgpLGEuc2V0U2VsZWN0ZWQoKSk7cmV0dXJuIHRoaXN9LGdldFNlbGVjdGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VG9nZ2xlQnV0dG9uQnlTZWxlY3RvcigiLmEtYnV0dG9uLmEtYnV0dG9uLXNlbGVjdGVkIil9LApnZXRUb2dnbGVCdXR0b25CeVNlbGVjdG9yOmZ1bmN0aW9uKGEpe3JldHVybiBlKHRoaXMuXyR0b2dnbGVHcm91cEVsZW1lbnQuZmluZChhKSl9fSk7cmV0dXJuIGZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBmKGEsYil9fSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGMpe3ZhciBlPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZj1lLl9uYW1lc3BhY2V8fGUuYXR0cmlidXRlRXJyb3JzLGE9Zj9mKCJBbWF6b25VSU1ldGVyIiwiQW1hem9uVUkiKTplO2EuZ3VhcmRGYXRhbD9hLmd1YXJkRmF0YWwoYykoYSx3aW5kb3cpOmEuZXhlY3V0ZShmdW5jdGlvbigpe2MoYSx3aW5kb3cpfSl9KShmdW5jdGlvbihjLGUsZil7Yy53aGVuKCJBIiwicmVhZHkiKS5yZWdpc3RlcigiYS1tZXRlcnMiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuJDtpZihkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXt2YXIgYz1mdW5jdGlvbihhKXthLnJlbW92ZUNsYXNzKCJhLW1ldGVyLXVuZmlsbGVkIikuYWRkQ2xhc3MoImEtbWV0ZXItZmlsbGVkIil9O2IoIi5hLW1ldGVyLWJhciIpLm5vdCgiLmEtbWFudWFsLWFuaW1hdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1iKHRoaXMpO2Eub25TY3JlZW4oZCwwKXx8ZC5hZGRDbGFzcygiYS1tZXRlci11bmZpbGxlZCIpfSk7CmIoImJvZHkiKS5hZGRDbGFzcygiYS1tZXRlci1hbmltYXRlIik7YS5vbigicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIHNjcm9sbCIsZnVuY3Rpb24oZCl7YigiLmEtbWV0ZXItdW5maWxsZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Yih0aGlzKTthLm9uU2NyZWVuKGQsMCkmJmMoZCl9KX0pO2Eub24oImE6cG9wb3ZlcjphZnRlclNob3ciLGZ1bmN0aW9uKGEpeyJhamF4IiE9PWEucG9wb3Zlci5jdXJyZW50RGF0YVN0cmF0ZWd5JiYoYT1hLnBvcG92ZXIuJHBvcG92ZXIuZmluZCgiLmEtbWV0ZXItdW5maWxsZWQiKSxhLmxlbmd0aCYmYyhhKSl9KTthLm9uKCJhOnBvcG92ZXI6YWpheENvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKGQpe3ZhciBiPWQucG9wb3Zlci4kcG9wb3Zlci5maW5kKCIuYS1tZXRlci1iYXIiKS5ub3QoIi5hLW1hbnVhbC1hbmltYXRpb24iKTtiLmxlbmd0aCYmKGIuYWRkQ2xhc3MoImEtbWV0ZXItdW5maWxsZWQiKSxhLmRlbGF5KGZ1bmN0aW9uKCl7YyhiKX0sMTcpKX0pfX0pfSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihnKXt2YXIgeT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLHo9eS5fbmFtZXNwYWNlfHx5LmF0dHJpYnV0ZUVycm9ycyxiPXo/eigiQW1hem9uVUlTdGFuZGFyZENvbXBvbmVudCIsIkFtYXpvblVJIik6eTtiLmd1YXJkRmF0YWw/Yi5ndWFyZEZhdGFsKGcpKGIsd2luZG93KTpiLmV4ZWN1dGUoZnVuY3Rpb24oKXtnKGIsd2luZG93KX0pfSkoZnVuY3Rpb24oZyx5LHope2cud2hlbigiQSIsInBydjphLXNjLWNvbXBvbmVudC1mYWN0b3J5IikucmVnaXN0ZXIoImEtc2MiLGZ1bmN0aW9uKGIsZil7dmFyIGQ9bmV3IGY7cmV0dXJue2RlZmluZTpmdW5jdGlvbihhKXthLmNvbXBvbmVudHMmJmIuZWFjaChhLmNvbXBvbmVudHMsZnVuY3Rpb24oYSl7aWYoIShhIGluc3RhbmNlb2YgZikpdGhyb3cgRXJyb3IoIllvdSBtdXN0IHByb3ZpZGUgYSBjb21wb25lbnQgZmFjdG9yeSB3aGVuIHNwZWNpZnlpbmcgY2hpbGQgY29tcG9uZW50cyIpO30pO3JldHVybiBkLnJlZGVmaW5lKGEpfX19KTsKZy53aGVuKCJBIikucmVnaXN0ZXIoInBydjphLXNjLXV0aWwiLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGYoYSxiLGMpeyJ2YWx1ZSJpbiBjJiYoYVtiXT1jLnZhbHVlKTtyZXR1cm4gYX1iPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgZDt0cnl7Yih7fSwieCIse30pLGQ9ITB9Y2F0Y2goYSl7ZD0hMX1yZXR1cm57ZGVmaW5lUHJvcGVydHk6ZD9iOmZ9fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLXV0aWwiKS5yZWdpc3RlcigicHJ2OmEtc2MtYmFzZSIsZnVuY3Rpb24oYixmKXt2YXIgZD1mLmRlZmluZVByb3BlcnR5O2I9Yi5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihhLGIsYyl7ZCh0aGlzLCJfX3NpZCIse3ZhbHVlOmF9KTtkKHRoaXMsIl9faWQiLHt2YWx1ZTpifSk7ZCh0aGlzLCJfX3BpZCIse3ZhbHVlOmN9KTtkKHRoaXMsImlzUm9vdCIse3ZhbHVlOiFjLHdyaXRhYmxlOiExfSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiIrdGhpcy5fX2lkfX0pOwpmPWIuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLl9zdXBlcihhLGIsYyk7ZCh0aGlzLCJfX2F0Iix7dmFsdWU6LTEsd3JpdGFibGU6ITB9KTtkKHRoaXMsIl9fdG8iLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSk7ZCh0aGlzLCJfX2J1c3kiLHt2YWx1ZTohMSx3cml0YWJsZTohMH0pfX0pO3JldHVybntDb21wb25lbnRTdGF0ZTpiLENvbXBvbmVudDpmfX0pOyJ1c2Ugc3RyaWN0IjtnLndoZW4oInBydjphLXNjLWRhdGFzdG9yZSIpLnJlZ2lzdGVyKCJwcnY6YS1zYy1yZWdpc3RyeSIsZnVuY3Rpb24oYil7dmFyIGY9e30sZD17fSxhPTAsZT0wO3JldHVybntzcGVjaWZpY2F0aW9uczp7fSxjb25zdHJ1Y3RvcnM6e30saW5zdGFuY2VzOmYsZGF0YXN0b3Jlczp7fSxoaWVyYXJjaHk6ZCxlbGVtZW50czp7fSxoYW5kbGVyczp7fSxjaGlsZHJlbjpmdW5jdGlvbihhKXthPWRbYV07dmFyIGI9W10sZTtmb3IoZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIucHVzaChmW2FbZV1dKTsKcmV0dXJuIGJ9LGdldE5leHRJbnN0YW5jZUlkOmZ1bmN0aW9uKCl7cmV0dXJuKythfSxnZXROZXh0U3BlY2lmaWNhdGlvbklkOmZ1bmN0aW9uKCl7cmV0dXJuKytlfX19KTsidXNlIHN0cmljdCI7Zy53aGVuKCJBIiwicHJ2OmEtc2MtdXRpbCIpLnJlZ2lzdGVyKCJwcnY6YS1zYy1saWZlY3ljbGUiLGZ1bmN0aW9uKGIsZil7ZnVuY3Rpb24gZCgpe3JldHVybiBiLmNvbnN0YW50cy5OT09QfWZ1bmN0aW9uIGEoYSxiLGUpe2ModGhpcywibmFtZSIse3ZhbHVlOmF9KTtjKHRoaXMsImVudGVyIix7dmFsdWU6Yn0pO2ModGhpcywibGVhdmUiLHt2YWx1ZTplfSl9ZnVuY3Rpb24gZShhKXtjKHRoaXMsInN0YXRlcyIse3ZhbHVlOmF9KTtjKHRoaXMsInN0YXRlTmFtZXMiLHt2YWx1ZTpiLm1hcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9KX0pO2ModGhpcywibWV0aG9kTmFtZXMiLHt2YWx1ZTpiLnJlZHVjZShhLGZ1bmN0aW9uKGEsYil7YS5wdXNoKGIuZW50ZXIpO2EucHVzaChiLmxlYXZlKTsKcmV0dXJuIGF9LFtdKX0pfXZhciBjPWYuZGVmaW5lUHJvcGVydHk7YS5jcmVhdGU9ZnVuY3Rpb24oYixlLGMpe3JldHVybiBuZXcgYShiLGUsYyl9O2UucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RhdGVOYW1lcy5pbmRleE9mKGEpfTtlLnByb3RvdHlwZS5lbnRlckZvckluZGV4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0YXRlc1thXS5lbnRlcn07ZS5wcm90b3R5cGUubGVhdmVGb3JJbmRleD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdGF0ZXNbYV0ubGVhdmV9O2UucHJvdG90eXBlLmdldFRyYW5zaXRpb25BcnJheT1mdW5jdGlvbihhLGUpe3ZhciBjPWE8ZSxoPWM/ImVudGVyIjoibGVhdmUiLGY9Yz8xOi0xO3JldHVybiBiLm1hcChiLnJhbmdlKGM/YSsxOmEsZStmLGYpLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0YXRlc1thXVtoXX0sdGhpcyl9O2UucHJvdG90eXBlLmltcGxlbWVudD1mdW5jdGlvbihhLGUpe2E9YXx8e307ZT0iZnVuY3Rpb24iPT09CnR5cGVvZiBlP2U6ZDtyZXR1cm4gYi5yZWR1Y2UodGhpcy5zdGF0ZXMsZnVuY3Rpb24oYixjKXtiW2MuZW50ZXJdPWFbYy5lbnRlcl18fGUoYy5lbnRlcixjKTtiW2MubGVhdmVdPWFbYy5sZWF2ZV18fGUoYy5sZWF2ZSxjKTtyZXR1cm4gYn0se30pfTtlLmNyZWF0ZT1mdW5jdGlvbihjKXtjPWIubWFwKGMsZnVuY3Rpb24oYil7cmV0dXJuIGEuY3JlYXRlLmFwcGx5KG51bGwsYil9KTtyZXR1cm4gbmV3IGUoYyl9O3JldHVybntjcmVhdGU6ZS5jcmVhdGV9fSk7InVzZSBzdHJpY3QiO2cud2hlbigicHJ2OmEtc2MtbGlmZWN5Y2xlIikucmVnaXN0ZXIoInBydjphLXNjLWxpZmVjeWNsZS1pbnN0YW5jZXMiLGZ1bmN0aW9uKGIpe3JldHVybntzdGFuZGFyZDpiLmNyZWF0ZShbWyJjcmVhdGVkIiwiY3JlYXRlIiwiZGVzdHJveSJdLFsibG9hZGVkIiwibG9hZCIsInVubG9hZCJdLFsicmVuZGVyZWQiLCJyZW5kZXIiLCJyZW1vdmUiXSxbInZpc2libGUiLCJzaG93IiwiaGlkZSJdXSl9fSk7InVzZSBzdHJpY3QiOwpnLndoZW4oIkEiKS5yZWdpc3RlcigicHJ2OmEtc2MtZXZlbnQtZW1pdHRlciIsZnVuY3Rpb24oYil7dmFyIGY9L1xzKy8sZD17b246ZnVuY3Rpb24oYSxlLGMpe2E9Zi50ZXN0KGEpP2Euc3BsaXQoZik6YTtiLmlzQXJyYXkoYSk/Yi5lYWNoKGEsZnVuY3Rpb24oYSl7dGhpcy5vbihhLGUsYyl9LHRoaXMpOih0aGlzLl9fZXZlbnRzW2FdfHwodGhpcy5fX2V2ZW50c1thXT1bXSkpLnB1c2goe2hhbmRsZXI6ZSxjb250ZXh0OmN8fHRoaXN9KTtyZXR1cm4gdGhpc30sb2ZmOmZ1bmN0aW9uKGEsZSl7dmFyIGMsZDtpZighYSYmIWUpcmV0dXJuIHRoaXMuX19ldmVudHM9e30sdGhpczthPWYudGVzdChhKT9hLnNwbGl0KGYpOmE7aWYoYi5pc0FycmF5KGEpKXJldHVybiBiLmVhY2goYSxmdW5jdGlvbihhKXt0aGlzLm9mZihhLGUpfSx0aGlzKSx0aGlzO2lmKCFlKXJldHVybiBkZWxldGUgdGhpcy5fX2V2ZW50c1thXSx0aGlzO2M9dGhpcy5fX2V2ZW50c1thXTt0aGlzLl9fZXZlbnRzW2FdPWQ9CltdO2IuZWFjaChjLGZ1bmN0aW9uKGEpe2EuaGFuZGxlciE9PWUmJmQucHVzaChhKX0sdGhpcyk7ZC5sZW5ndGh8fGRlbGV0ZSB0aGlzLl9fZXZlbnRzW2FdO3JldHVybiB0aGlzfSx0cmlnZ2VyOmZ1bmN0aW9uKGEpe3ZhciBlLGM7aWYoIXRoaXMuX19ldmVudHN8fCFhKXJldHVybiB0aGlzO2M9dGhpcy5fX2V2ZW50c1thXTtpZighYylyZXR1cm4gdGhpcztlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2IuZWFjaChjLGZ1bmN0aW9uKGEpe2EuaGFuZGxlci5hcHBseShhLmNvbnRleHQsZSl9KTtyZXR1cm4gdGhpc319O3JldHVybntpbml0OmZ1bmN0aW9uKGEpe2EuX19ldmVudHM9YS5fX2V2ZW50c3x8e307cmV0dXJuIGF9LG1peGluOmZ1bmN0aW9uKGEpe2IubWl4aW4oYSxkKTtyZXR1cm4gYX19fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLWJhc2UiLCJwcnY6YS1zYy1saWZlY3ljbGUtaW5zdGFuY2VzIiwiM3AtcHJvbWlzZSIsInBydjphLXNjLWRlZmF1bHQtZGF0YXN0b3JlIiwKInBydjphLXNjLXJlZ2lzdHJ5IiwicHJ2OmEtc2MtY29tcG9uZW50LXByb3hpZXMiKS5yZWdpc3RlcigicHJ2OmEtc2MtZGVmaW5lIixmdW5jdGlvbihiLGYsZCxhLGUsYyxwKXtmdW5jdGlvbiBnKG0sYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxjPWhbdGhpcy5fX3NpZF0sZj1hLnJlc29sdmUoKSxkPXRoaXMuX19hdCxyO2lmKGQ9PT1tfHxiJiZkPm18fCFiJiZkPG0pcmV0dXJuIGY7Zm9yKGQ9ay5nZXRUcmFuc2l0aW9uQXJyYXkoZCxtKTtyPWQuc2hpZnQoKTspKGZ1bmN0aW9uKGEpe2Y9Zi50aGVuKGMubGlmZWN5Y2xlW2FdLmNhbGwobmV3IHAuVHJhbnNpdGlvbihlKSkpLnRoZW4oYy52aWV3W2FdLmNhbGwobmV3IHAuVmlldyhlKSkpLnRoZW4oZnVuY3Rpb24oKXtiP2UuX19hdCsrOmUuX19hdC0tfSl9KShyKTtyZXR1cm4gZlsiY2F0Y2giXShmdW5jdGlvbihhKXtjb25zb2xlLmVycm9yKGEpfSl9fXZhciBrPWQuc3RhbmRhcmQsaD1jLnNwZWNpZmljYXRpb25zLHI9CmMuY29uc3RydWN0b3JzLGw9Yy5pbnN0YW5jZXMsbj1jLmRhdGFzdG9yZXMsdD1jLmhpZXJhcmNoeSx1PWMuaGFuZGxlcnMsdix4O2Q9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtmb3IodmFyIHc9MDt3PGsuc3RhdGVzLmxlbmd0aDt3Kyspdj1rLnN0YXRlc1t3XSxkW3YuZW50ZXJdPWcodywhMCksZFt2LmxlYXZlXT1nKHcsITEpO3g9Zi5Db21wb25lbnQuZXh0ZW5kKGQpO3JldHVybiBmdW5jdGlvbihhLGQpe2EubGlmZWN5Y2xlPWsuaW1wbGVtZW50KGEubGlmZWN5Y2xlfHx7fSk7YS52aWV3PWsuaW1wbGVtZW50KGEudmlld3x8e30pO3ZhciBmPWEuY29tcG9uZW50c3x8e30sdj1hLmRhdGF8fHt9LHA9YS5ldmVudHN8fHt9LGc7ZD1kfHxjLmdldE5leHRTcGVjaWZpY2F0aW9uSWQoKTtoW2RdPWE7dVtkXT17fTtmb3IoZyBpbiBwKXAuaGFzT3duUHJvcGVydHkoZykmJih1W2RdW2ddPXBbZ10pO3JldHVybiB4LmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhLAptKXt2YXIgaD1jLmdldE5leHRJbnN0YW5jZUlkKCk7dGhpcy5fc3VwZXIoZCxoLG0pO2E9Yi5leHRlbmQoe30sdixhKTtsW2hdPXRoaXM7bltoXT1uZXcgZShhKTt0W2hdPXt9O2IuZWFjaChmLGZ1bmN0aW9uKGEsYil7YT1uZXcgclthXShhLmRlZmF1bHREYXRhLGgpO3RbaF1bYl09YS50b1N0cmluZygpfSl9fSl9fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLWV2ZW50LWVtaXR0ZXIiLCJwcnY6YS1zYy11dGlsIikucmVnaXN0ZXIoInBydjphLXNjLWRhdGFzdG9yZSIsZnVuY3Rpb24oYixmLGQpe3ZhciBhPWQuZGVmaW5lUHJvcGVydHk7cmV0dXJuIGIuY3JlYXRlQ2xhc3Moe2luaXQ6ZnVuY3Rpb24oZSl7aWYoZSYmIm9iamVjdCIhPT10eXBlb2YgZSl0aHJvdyBFcnJvcigiRGF0YXN0b3JlcyBvbmx5IGFjY2VwdCBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMgYXMgaW5wdXQiKTtlPWIuY29weShlfHx7fSk7YSh0aGlzLCJzdG9yZSIse3ZhbHVlOmV9KX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0b3JlW2FdfSwKc2V0OmZ1bmN0aW9uKGEsYil7aWYodm9pZCAwPT09YXx8bnVsbD09PWF8fHZvaWQgMD09PWIpcmV0dXJuITE7dGhpcy5zdG9yZVthXT1iO3JldHVybiEwfX0pLmV4dGVuZChmLm1peGluKHtpbml0OmZ1bmN0aW9uKGEpe3RoaXMuX3N1cGVyKGEpO2YuaW5pdCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5zdG9yZVthXTtyZXR1cm4gdGhpcy5fc3VwZXIoYSxjKSYmIWIuZXF1YWxzKGQsYyk/KHRoaXMudHJpZ2dlcigiY2hhbmdlOiIrYSxkLGMpLCEwKTohMX19KSl9KTsidXNlIHN0cmljdCI7Zy53aGVuKCJBIiwicHJ2OmEtc2MtZGF0YXN0b3JlIiwicHJ2OmEtc2MtcmVnaXN0cnkiLCJwcnY6YS1zYy1jb21wb25lbnQtcHJveGllcyIsInBydjphLXNjLWxpZmVjeWNsZS1pbnN0YW5jZXMiKS5yZWdpc3RlcigicHJ2OmEtc2MtZGVmYXVsdC1kYXRhc3RvcmUiLGZ1bmN0aW9uKGIsZixkLGEsZSl7dmFyIGM9L1xzKy8sZz1kLmluc3RhbmNlcyxxPWQuc3BlY2lmaWNhdGlvbnMsCms9ZS5zdGFuZGFyZCxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihjLGQpe2M9Z1tjXTt2YXIgZT1xW2MuX19zaWRdLnZpZXcsZj1rLmVudGVyRm9ySW5kZXgoYy5fX2F0KTtlW2ZdLmNhbGwobmV3IGEuVmlldyhjKSxkKX12YXIgYz17fSxkPXt9O3JldHVybnthZGQ6ZnVuY3Rpb24oYSxlLGYsaCl7dmFyIGs9ZFthXSxtPWNbYV07YT1nW2FdO2smJmNsZWFyVGltZW91dChrKTttfHwoY1thXT1tPXt9KTttW2VdPXtvbGRWYWx1ZTpmLG5ld1ZhbHVlOmh9O2RbYV09c2V0VGltZW91dChmdW5jdGlvbigpe2IoYSxtKTtkW2FdPWNbYV09bnVsbH0sMTAwKX0sdHJpZ2dlcjpifX0oKTtyZXR1cm4gZi5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYztmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJiJmdW5jdGlvbiIhPT10eXBlb2YgYVtjXSYmKGJbY109YVtjXSk7dGhpcy5fc3VwZXIoYil9LGdldFByb3h5OmZ1bmN0aW9uKGEsZCl7dmFyIGU9dGhpcyxmPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGUuZ2V0KGEpfX07CiEwIT09ZCYmKGYuc2V0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuc2V0KGEsYil9LGYuYmluZD1mdW5jdGlvbihkLGYpe2Q9ZC5zcGxpdChjKTtmPWZ8fHt9O2IuZWFjaChkLGZ1bmN0aW9uKGIpe2Uub24oImNoYW5nZToiK2IsZnVuY3Rpb24oYyxkKXt2YXIgZTshMT09PWYuYmF0Y2g/KGU9e30sZVtiXT17b2xkVmFsdWU6YyxuZXdWYWx1ZTpkfSxoLnRyaWdnZXIoYSxlKSk6aC5hZGQoYSxiLGMsZCl9KX0pfSxmLnVuYmluZD1mdW5jdGlvbihhKXthPyhhPWEuc3BsaXQoYyksYi5lYWNoKGEsZnVuY3Rpb24oYSl7ZS5vZmYoImNoYW5nZToiK2EpfSkpOmUub2ZmKCl9KTtyZXR1cm4gZn19KX0pOyJ1c2Ugc3RyaWN0IjtnLndoZW4oIkEiLCJwcnY6YS1zYy1kZWZpbmUiKS5yZWdpc3RlcigicHJ2OmEtc2MtY29tcG9uZW50LWNvbGxlY3Rpb24iLGZ1bmN0aW9uKGIsZil7dmFyIGQ9e307cmV0dXJue2dldDpmdW5jdGlvbihhKXtpZihkW2FdKXJldHVybiBkW2FdO2RbYV09Zih7ZGF0YTp7ZmFjdG9yeTphLAppbmRleDpbXX19KTtyZXR1cm4gZFthXX19fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLXJlZ2lzdHJ5IiwicHJ2OmEtc2MtYmFzZSIsInBydjphLXNjLWRlZmluZSIsInBydjphLXNjLWNvbXBvbmVudC1jb2xsZWN0aW9uIikucmVnaXN0ZXIoInBydjphLXNjLWNvbXBvbmVudC1mYWN0b3J5IixmdW5jdGlvbihiLGYsZCxhLGUpe3ZhciBjPWYuc3BlY2lmaWNhdGlvbnMsZz1mLmNvbnN0cnVjdG9ycyxxPTAsaz1kLkNvbXBvbmVudFN0YXRlLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLl9zdXBlcihhLGJ8fCsrcSk7dGhpcy5kZWZhdWx0RGF0YT1kfHx7fTtjJiYoZ1t0aGlzXT1jKX0sZ2V0SW5zdGFuY2U6ZnVuY3Rpb24oYSl7dmFyIGM9Z1t0aGlzXTthPWIuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdERhdGEsYSk7cmV0dXJuIG5ldyBjKGEpfSx0b0NvbGxlY3Rpb246ZnVuY3Rpb24oKXtpZighZ1t0aGlzXSl0aHJvdyBFcnJvcigiWW91IGNhbm5vdCBjcmVhdGUgYSBjb2xsZWN0aW9uIG9mIG5vdGhpbmciKTsKcmV0dXJuIG5ldyBrKG51bGwsbnVsbCxlLmdldCh0aGlzKSx0aGlzLmRlZmF1bHREYXRhKX0scmVkZWZpbmU6ZnVuY3Rpb24oZCl7dmFyIGU9Yi5rZXlzKGQpO2lmKCFlLmxlbmd0aCYmdGhpcy5fX3NpZCl0aHJvdyBFcnJvcigiWW91IG11c3QgcHJvdmlkZSBhIG5ldyBzcGVjaWZpY2F0aW9uIHRvIHRoZSBgcmVkZWZpbmVgIG1ldGhvZCIpO2lmKDE9PT1lLmxlbmd0aCYmImRhdGEiPT09ZVswXSlyZXR1cm4gbmV3IGsodGhpcy5fX3NpZCx0aGlzLl9faWQsbnVsbCxkLmRhdGEpO2Q9Yi5leHRlbmQoe30sY1t0aGlzLl9fc2lkXXx8e30sZCk7ZT1mLmdldE5leHRTcGVjaWZpY2F0aW9uSWQoKTtkPWEoZCxlKTtyZXR1cm4gbmV3IGsoZSxudWxsLGQpfX0pO3JldHVybiBrfSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLXJlZ2lzdHJ5IiwicHJ2OmEtc2MtYmFzZSIsInBydjphLXNjLWV2ZW50cyIsInBydjphLXNjLWxpZmVjeWNsZS1pbnN0YW5jZXMiLCIzcC1wcm9taXNlIikucmVnaXN0ZXIoInBydjphLXNjLWNvbXBvbmVudC1wcm94aWVzIiwKZnVuY3Rpb24oYixmLGQsYSxlLGMpe3ZhciBnPWYuaW5zdGFuY2VzLHE9Zi5jb25zdHJ1Y3RvcnMsaz1mLmRhdGFzdG9yZXMsaD1mLmhpZXJhcmNoeSxyPWYuZWxlbWVudHMsbD1lLnN0YW5kYXJkLG49L1xzKy8sdD1NYXRoLnBvdygyLDMyKTtmPWQuQ29tcG9uZW50U3RhdGUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYixjKXthIGluc3RhbmNlb2YgZC5Db21wb25lbnRTdGF0ZT90aGlzLl9zdXBlcihhLl9fc2lkLGEuX19pZCxhLl9fcGlkKTp0aGlzLl9zdXBlcihhLGIsYyl9fSk7dmFyIHU9Zi5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX3N1cGVyKGEsYixjKTt0aGlzLmRhdGE9a1t0aGlzXS5nZXRQcm94eSh0aGlzKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyB4KHRoaXMpKS5maWx0ZXIoYSl9LGNvbGxlY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB3KHRoaXMsYSl9LGRpc3BhdGNoOmZ1bmN0aW9uKGIpe2EuZGlzcGF0Y2guY2FsbCh0aGlzLApiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX0sYnJvYWRjYXN0OmZ1bmN0aW9uKGIpe2EuYnJvYWRjYXN0LmNhbGwodGhpcyxiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KTtlPWYuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLl9zdXBlcihhLGIsYyk7dGhpcy5kYXRhPWtbdGhpc10uZ2V0UHJveHkodGhpcywhMCl9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gclt0aGlzLl9faWRdfHxudWxsfSxzZXRFbGVtZW50OmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudClyW3RoaXMuX19pZF09YTtlbHNlIHRocm93IEVycm9yKCJZb3UgbXVzdCBwcm92aWRlIGFuIEhUTUxFbGVtZW50IG9iamVjdCB0byBWaWV3LnNldEVsZW1lbnQiKTt9LHVuc2V0RWxlbWVudDpmdW5jdGlvbigpe3JbdGhpcy5fX2lkXT1udWxsfSxkaXNwYXRjaDpmdW5jdGlvbihiKXthLnZpZXdEaXNwYXRjaC5jYWxsKG5ldyB1KHRoaXMuX19zaWQsdGhpcy5fX2lkLAp0aGlzLl9fcGlkKSxiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KTt2YXIgdj17aW5pdDpmdW5jdGlvbihhKXt0aGlzLl9zdXBlcihhKTt0aGlzLl9fY2FjaGU9W119LGZpbHRlcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9fY2FjaGU9W107YSYmInN0cmluZyI9PT10eXBlb2YgYT8oYz1iLm1hcChhLnNwbGl0KG4pLGZ1bmN0aW9uKGEpe3JldHVybihhPWhbdGhpc11bYV18fG51bGwpP2dbYV06YX0sdGhpcyksYz1iLmZpbHRlcihjLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YX0pKTpjPWIubWFwKGIudmFsdWVzKGhbdGhpc10pLGZ1bmN0aW9uKGEpe3JldHVybiBnW2FdfSk7dGhpcy5fX2NhY2hlPWM7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGIsYyl7Yj1uZXcgcVtiXShjLHRoaXMuX19pZCk7aFt0aGlzXVthXT1iLl9faWQ7dGhpcy5fX2NhY2hlLnB1c2goYik7cmV0dXJuIHRoaXN9LGRpc293bjpmdW5jdGlvbihhKXt2YXIgYz1oW3RoaXNdW2FdLGQ7aWYoIWMpcmV0dXJuIHRoaXM7CmRlbGV0ZSBoW3RoaXNdW2FdO2Q9Z1tjXTt0aGlzLl9fY2FjaGU9Yi5maWx0ZXIodGhpcy5fX2NhY2hlLGZ1bmN0aW9uKGEpe3JldHVybiBhIT09ZH0pO3JldHVybiB0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2NhY2hlLmxlbmd0aH19LGw9bC5pbXBsZW1lbnQoe30sZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMuYWxsKGIubWFwKHRoaXMuX19jYWNoZSxmdW5jdGlvbihiKXtyZXR1cm4gYlthXSgpfSkpfX0pO2IubWl4aW4odixsKTt2YXIgeD1mLmV4dGVuZCh2KSx3PXguZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYil7YT1nW2hbYV1bYl1dO2lmKCFhKXRocm93IEVycm9yKCJDaGlsZCBjb2xsZWN0aW9uIG5hbWVkICIrYisiIGRvZXMgbm90IGV4aXN0Iik7dGhpcy5fc3VwZXIoYSk7dGhpcy5maWx0ZXIoKX0sZmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N1cGVyKCl9LGFkZDpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZjtpZigic3RyaW5nIj09PQp0eXBlb2YgYXx8IWIuaXNGaW5pdGVOdW1iZXIoYykpdGhyb3cgRXJyb3IoIkFyZ3VtZW50IGVycm9yLCB1c2FnZTogQ29sbGVjdGlvbi5hZGQoZGF0YTpvYmplY3QsIGluZGV4OmludGVnZXIpIik7ZD1rW3RoaXNdO2U9ZC5nZXQoImZhY3RvcnkiKTtmPWQuZ2V0KCJpbmRleCIpO2U9bmV3IHFbZV0oYSx0aGlzLl9faWQpO2E9ZS50b1N0cmluZygpO2hbdGhpc11bYV09ZS5fX2lkO3RoaXMuX19jYWNoZS5wdXNoKGUpO2Yuc3BsaWNlKGMsMCxhKTtkLnNldCgiaW5kZXgiLGYpO3JldHVybiB0aGlzfSxhcHBlbmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKGEsdCl9LHByZXBlbmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKGEsMCl9LGluc2VydDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmFkZChhLGIpfSxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9a1t0aGlzXS5nZXQoImluZGV4Iik7aWYoMD5hfHxhPmIubGVuZ3RoLTEpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7CnJldHVybihuZXcgeCh0aGlzKSkuZmlsdGVyKGJbYV0pfSxkaXNvd246ZnVuY3Rpb24oYSl7dmFyIGI9a1t0aGlzXS5nZXQoImluZGV4Iik7aWYoMD5hfHxhPmIubGVuZ3RoLTEpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7YT1iLnNwbGljZShhLDEpO3JldHVybiB0aGlzLl9zdXBlcihhWzBdKX19KTtyZXR1cm57VHJhbnNpdGlvbjp1LFZpZXc6ZSxDaGlsZENvbXBvbmVudDp4LENoaWxkQ29sbGVjdGlvbjp3fX0pOyJ1c2Ugc3RyaWN0IjtnLndoZW4oIkEiLCJwcnY6YS1zYy1yZWdpc3RyeSIpLnJlZ2lzdGVyKCJwcnY6YS1zYy1ldmVudHMiLGZ1bmN0aW9uKGIsZil7dmFyIGQ9Zi5pbnN0YW5jZXMsYT1mLmhhbmRsZXJzLGU9ZnVuY3Rpb24gcChiLGUpe3ZhciBmPXRoaXMuY29uc3RydWN0b3IsZyxsLG47dGhpcy5pc1Jvb3R8fChsPWRbdGhpcy5fX3BpZF0sZz1hW2wuX19zaWRdW2JdLGY9bmV3IGYobC5fX3NpZCxsLl9faWQsbC5fX3BpZCksZyYmKG49CiExPT09Zy5hcHBseShmLGUpKSxufHxwLmNhbGwoZixiLGUpKX07cmV0dXJue2Rpc3BhdGNoOmUsdmlld0Rpc3BhdGNoOmZ1bmN0aW9uKGIsZil7dmFyIGcsaDsoZz1hW2RbdGhpc10uX19zaWRdW2JdKSYmKGg9ITE9PT1nLmFwcGx5KHRoaXMsZikpO2h8fGUuY2FsbCh0aGlzLGIsZil9LGJyb2FkY2FzdDpmdW5jdGlvbiBxKGQsZSl7dmFyIGc9dGhpcy5jb25zdHJ1Y3RvcixsPWYuY2hpbGRyZW4odGhpcyksbix0LHU7bC5sZW5ndGgmJmIuZWFjaChsLGZ1bmN0aW9uKGIpe3Q9YVtiLl9fc2lkXVtkXTtuPW5ldyBnKGIuX19zaWQsYi5fX2lkLGIuX19waWQpO3QmJih1PSExPT09dC5hcHBseShuLGUpKTt1fHxxLmNhbGwobixkLGUpfSl9fX0pfSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihmKXt2YXIgcT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLGs9cS5fbmFtZXNwYWNlfHxxLmF0dHJpYnV0ZUVycm9ycyxkPWs/aygiQW1hem9uVUlDYXJkIiwiQW1hem9uVUkiKTpxO2QuZ3VhcmRGYXRhbD9kLmd1YXJkRmF0YWwoZikoZCx3aW5kb3cpOmQuZXhlY3V0ZShmdW5jdGlvbigpe2YoZCx3aW5kb3cpfSl9KShmdW5jdGlvbihmLHEsayl7Zi5yZWdpc3RlcigicHJ2OmEtY2FyZC1jb25zdGFudHMiLGZ1bmN0aW9uKCl7dmFyIGQ9e1BJTk5FRF9BU19GSVhFRDowLFBJTk5FRF9BU19SRUxBVElWRToxLENBUkRfRE9XTjotMSxDQVJEX1VQOjEsQ0FSRF9QRUVLX1NJWkU6NzUsQ0FSRF9QSU5ORURfSEVBREVSX1NJWkU6NTYsQ0FSRF9QRUVLX0RFU0NSSVBUSU9OX1NVRkZJWDoiLWNhcmQtcGVlay1sYWJlbCIsQ0FSRF9CT0RZX0lEX1NVRkZJWDoiLWNhcmQtYm9keSIsc2VsZWN0b3JzOntDQVJEX0xJU1Q6Ii5hLWNhcmQtbGlzdCIsQ0FSRDoiLmEtY2FyZCIsCkNBUkRfSEVBREVSOiIuYS1jYXJkLWhlYWRlciIsQ0FSRF9CT0RZOiIuYS1jYXJkLWJvZHkiLENBUkRfQTExWV9MQUJFTDoiLmEtY2FyZC1wZWVrLWxhYmVsIn19O2Yud2hlbigicHJ2OnNraW4tdmFycyIpLmV4ZWN1dGUoZnVuY3Rpb24oZil7ZC5DQVJEX1BJTk5FRF9IRUFERVJfU0laRT1mLmNhcmQuQ0FSRF9QSU5ORURfSEVBREVSX1NJWkV9KTtyZXR1cm4gZH0pOyJ1c2Ugc3RyaWN0IjtmLndoZW4oIkEiLCJhLXNjIiwicHJ2OmEtY2FyZC1jb25zdGFudHMiKS5yZWdpc3RlcigiYS1jYXJkLWNvbXBvbmVudCIsZnVuY3Rpb24oZCxmLGcpe2Z1bmN0aW9uIGgoYixlLGEpe2Zvcig7IWUoYik7KXtmb3IodmFyIGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpJiZhW2NdKGIpKXJldHVybiBjO2I9Yi5wYXJlbnROb2RlfXJldHVybiIyIn1mdW5jdGlvbiBxKGIsZSxhKXtlJiYoZT1lLmdldEF0dHJpYnV0ZSgiaWQiKSxiLnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYT8iIjoKZSkpfWZ1bmN0aW9uIHQoYil7cmV0dXJuIGIuaXNUb3BUb3VjaGluZ0NhbnZhc1RvcHx8Yi5pc0N1dEJ5Q2FudmFzVG9wfWZ1bmN0aW9uIGsoYil7cmV0dXJuIGIuaXNUb3BUb3VjaGluZ0NhbnZhc1RvcHx8Yi5pc1RvcEJlbG93Q2FudmFzVG9wfWZ1bmN0aW9uIHYoYil7cmV0dXJuIGIuaXNCb3R0b21Ub3VjaENhbnZhc1RvcHx8Yi5pc0N1dEJ5Q2FudmFzVG9wfWZ1bmN0aW9uIGEoYil7cmV0dXJuIGIuaXNCb3R0b21Ub3VjaENhbnZhc1RvcHx8Yi5pc0Fib3ZlQ2FudmFzfWZ1bmN0aW9uIGMoYixlLGEpe2E/Yi5jbGFzc0xpc3QuYWRkKGUpOmIuY2xhc3NMaXN0LnJlbW92ZShlKX1yZXR1cm4gZi5kZWZpbmUoe2RhdGE6e2lkOiIiLGlkeDoiIixzZWxlY3RvcjoiIixleHBhbmRhYmxlOiExLGV4cGFuZGVkOiExLHBpbm5lZDohMSxoYXNQZWVrOiExLGNhbnZhc1RvcDowLHBpbm5lZE1vZGU6LTEsdW5waW5uZWRIZWFkZXJIZWlnaHQ6MCxzY3JvbGxEaXJlY3Rpb246MH0sZXZlbnRzOnsidWk6dG9nZ2xlLWNhcmQiOmZ1bmN0aW9uKCl7dmFyIGI9CiF0aGlzLmRhdGEuZ2V0KCJleHBhbmRlZCIpO3RoaXMuZGF0YS5zZXQoImV4cGFuZGVkIixiKTtifHx0aGlzLmRhdGEuc2V0KCJwaW5uZWQiLCExKTtyZXR1cm4hMX0sInVpOmV4cGFuZC1jYXJkIjpmdW5jdGlvbigpe3RoaXMuZGF0YS5zZXQoImV4cGFuZGVkIiwhMCk7cmV0dXJuITF9LCJjYXJkOnVwZGF0ZS1kb20tZGF0YSI6ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmdGhpcy5kYXRhLnNldChlLGJbZV0pfSwiY2FyZExpc3Q6cmVmcmVzaC1jYXJkIjpmdW5jdGlvbihiLGUpe2lmKHRoaXMuZGF0YS5nZXQoImlkIik9PT1iKXt2YXIgYz10aGlzLmRhdGEuZ2V0KCJjYXJkRWwiKTtiPXRoaXMuZGF0YS5nZXQoImNhbnZhc1RvcCIpO3ZhciBkPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseT1jLnF1ZXJ5U2VsZWN0b3IoZy5zZWxlY3RvcnMuQ0FSRF9IRUFERVIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9e19jYXJkUmVjdDpkLF9oZWFkZXJSZWN0OnksCmlzQWJvdmVDYW52YXM6ZC5ib3R0b208Yixpc0JvdHRvbVRvdWNoQ2FudmFzVG9wOmMuYm90dG9tPT09Yixpc1Zpc2libGVIZWlnaHRMZXNzVGhhblBpbm5lZEhlYWRlcjpkLmJvdHRvbS1iPGcuQ0FSRF9QSU5ORURfSEVBREVSX1NJWkUsaXNDdXRCeUNhbnZhc1RvcDpkLnRvcDxiJiZiPGQuYm90dG9tLGlzVG9wVG91Y2hpbmdDYW52YXNUb3A6ZC50b3A9PT1iLGlzVG9wQmVsb3dDYW52YXNUb3A6YjxkLnRvcH07Yy5pc1Zpc2libGVIZWlnaHRMZXNzVGhhblBpbm5lZEhlYWRlciYmKGMudmlzaWJsZUhlaWdodD1kLmJvdHRvbS1iKTt0aGlzLmRhdGEuZ2V0KCJwaW5uZWQiKT8oZT1lPT09Zy5DQVJEX1VQP2E6ayxlKGMpJiZ0aGlzLmRhdGEuc2V0KCJwaW5uZWQiLCExKSk6KGU9ZT09PWcuQ0FSRF9VUD90OnYsZShjKSYmdGhpcy5kYXRhLnNldCgicGlubmVkIiwhMCkpO3RoaXMuZGF0YS5nZXQoInBpbm5lZCIpJiZ0aGlzLmRhdGEuc2V0KCJwaW5uZWRNb2RlIixjLmlzVmlzaWJsZUhlaWdodExlc3NUaGFuUGlubmVkSGVhZGVyPwpnLlBJTk5FRF9BU19SRUxBVElWRTpnLlBJTk5FRF9BU19GSVhFRCl9fSwiY2FyZExpc3Q6dXBkYXRlLWNhbnZhcy10b3AiOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YS5zZXQoImNhbnZhc1RvcCIsYil9fSxsaWZlY3ljbGU6e3JlbmRlcjpmdW5jdGlvbigpe3RoaXMuZGF0YS5nZXQoImV4cGFuZGFibGUiKSYmKHRoaXMuZGF0YS5iaW5kKCJleHBhbmRlZCBjYW52YXNUb3AiKSx0aGlzLmRhdGEuYmluZCgicGlubmVkIix7YmF0Y2g6ITF9KSx0aGlzLmRhdGEuYmluZCgicGlubmVkTW9kZSIse2JhdGNoOiExfSkpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4oKS5zaG93KCl9fSx2aWV3OntyZW5kZXI6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3ZhciBhPWIuY3VycmVudFRhcmdldDtiPWgoYi50YXJnZXQsZnVuY3Rpb24oYil7cmV0dXJuIGI9PT1hfSx7MDpmdW5jdGlvbihiKXtyZXR1cm4iYSI9PT1iLnRhZ05hbWUudG9Mb3dlckNhc2UoKXx8Yi5jbGFzc0xpc3QuY29udGFpbnMoImFvay1jYXJkLWFsbG93LWludGVyYWN0aW9uIil9LAoxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmNsYXNzTGlzdC5jb250YWlucygiYS1jYXJkLWhlYWRlciIpfX0pOyIwIiE9PWImJigiMSI9PT1iP20uZGlzcGF0Y2goInVpOnRvZ2dsZS1jYXJkIik6bS5kYXRhLmdldCgiZXhwYW5kZWQiKXx8bS5kaXNwYXRjaCgidWk6ZXhwYW5kLWNhcmQiKSl9dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRhdGEuZ2V0KCJzZWxlY3RvciIpKSxhPWUucXVlcnlTZWxlY3RvcihnLnNlbGVjdG9ycy5DQVJEX0hFQURFUiksYz1lLnF1ZXJ5U2VsZWN0b3IoZy5zZWxlY3RvcnMuQ0FSRF9CT0RZKSxkPWUucXVlcnlTZWxlY3RvcihnLnNlbGVjdG9ycy5DQVJEX0ExMVlfTEFCRUwpLHU9dGhpcy5kYXRhLmdldCgiZXhwYW5kYWJsZSIpLG09dGhpcyxmPXRoaXMuZGF0YS5nZXQoImhhc1BlZWsiKSYmZCxsPXtjYXJkRWw6ZSxoZWFkZXJFbDphLGJvZHlFbDpjLGExMXlMYWJlbEVsOmQsc2hvdWxkTWFpbnRhaW5BMTF5TGFiZWw6Zn07aWYoYSl7dmFyIHA9CmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bC51bnBpbm5lZEhlYWRlckhlaWdodD1wLmhlaWdodH10aGlzLmRpc3BhdGNoKCJjYXJkOnVwZGF0ZS1kb20tZGF0YSIsbCk7dSYmZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYik7ZS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1leHBhbmRlZCIpJiZtLmRpc3BhdGNoKCJ1aTpleHBhbmQtY2FyZCIpO3UmJih1PXRoaXMuZGF0YS5nZXQoImlkIikrZy5DQVJEX0JPRFlfSURfU1VGRklYLGMuc2V0QXR0cmlidXRlKCJpZCIsdSksYS5zZXRBdHRyaWJ1dGUoImFyaWEtY29udHJvbHMiLHUpKTtmJiYoYz10aGlzLmRhdGEuZ2V0KCJpZCIpK2cuQ0FSRF9QRUVLX0RFU0NSSVBUSU9OX1NVRkZJWCxkLnNldEF0dHJpYnV0ZSgiaWQiLGMpLHEoYSxkLHRoaXMuZGF0YS5nZXQoImV4cGFuZGVkIikpKTt0aGlzLnNldEVsZW1lbnQoZSl9LHNob3c6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9dGhpcy5nZXRFbGVtZW50KCksbj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLApmPXRoaXMuZGF0YS5nZXQoImhlYWRlckVsIikseT10aGlzLmRhdGEuZ2V0KCJib2R5RWwiKSx1PXRoaXMuZGF0YS5nZXQoImExMXlMYWJlbEVsIiksbT10aGlzLmRhdGEuZ2V0KCJ1bnBpbm5lZEhlYWRlckhlaWdodCIpLGg9dGhpcy5kYXRhLmdldCgicGlubmVkIiksbD10aGlzLmRhdGEuZ2V0KCJleHBhbmRlZCIpLHA9dGhpcy5kYXRhLmdldCgiY2FudmFzVG9wIiksaz10aGlzLmRhdGEuZ2V0KCJwaW5uZWRNb2RlIikscj10aGlzLmRhdGEuZ2V0KCJpc0R5bmFtaWNDYXJkSGVpZ2h0Iik7dGhpcy5kYXRhLmdldCgiaGFzUGVlayIpO3ZhciB0PWIucGlubmVkJiZoLHY9Yi5waW5uZWQmJiFoLHc9ISFiLmV4cGFuZGVkO2I9dyYmbDt2YXIgeD13JiYhbCxuPW4uYm90dG9tPHAsej10aGlzLmRhdGEuZ2V0KCJzaG91bGRNYWludGFpbkExMXlMYWJlbCIpO2MoYSwiYW9rLWNhcmQtZXhwYW5kZWQiLGwpO2MoYSwiYS1jYXJkLWV4cGFuZGVkIixsKTtjKGEsImFvay1jYXJkLWNvbGxhcHNlZCIsCiFsKTtjKGEsImEtY2FyZC1jb2xsYXBzZWQiLCFsKTtjKGEsImEtY2FyZC1waW5uZWQiLGgpO2MoYSwiYS1jYXJkLXBpbm5lZC1maXhlZCIsaCYmaz09PWcuUElOTkVEX0FTX0ZJWEVEKTtjKGEsImEtY2FyZC1waW5uZWQtcmVsYXRpdmUiLGgmJms9PT1nLlBJTk5FRF9BU19SRUxBVElWRSk7Zi5zdHlsZS50b3A9az09PWcuUElOTkVEX0FTX0ZJWEVEP3ArInB4IjoiIjtyP2MoYSwiYS1jYXJkLWFib3ZlLWNhbnZhcyIsbik6dD9hLnN0eWxlLnBhZGRpbmdUb3A9bSsicHgiOnYmJihhLnN0eWxlLnBhZGRpbmdUb3A9MCk7bj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2E9ZC52aWV3cG9ydCgpLmhlaWdodDtoPW4udG9wPHA7az1hPG4uYm90dG9tO3I9MDt0JiZ0aGlzLmRpc3BhdGNoKCJjYXJkOnVwZGF0ZWQtcGlubmVkLWluZGV4Iix0aGlzLmRhdGEuZ2V0KCJpZHgiKSk7aCYmKGJ8fHgpP3I9Zy5DQVJEX0RPV04qKHAtbi50b3ApOmsmJmImJihyPU1hdGgubWluKG4uaGVpZ2h0LG0rMioKZy5DQVJEX1BFRUtfU0laRSkscj1nLkNBUkRfVVAqKHItKGEtbi50b3ApKSk7ciYmdGhpcy5kaXNwYXRjaCgiY2FyZDpzY3JvbGwtY2FyZC1saXN0LXVwIixyKTt3JiYobT1iPyJleHBhbmQiOiJjb2xsYXBzZSIscD10aGlzLmRhdGEuZ2V0KCJpZCIpLGQudHJpZ2dlcigiYTpjYXJkOiIrbSx7Y2FyZDpwfSksZC50cmlnZ2VyKCJhOmNhcmQ6IitwKyI6IittKSxmLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsbCkseS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwhbCkseiYmcShmLHUsYikpfX19fSl9KTsidXNlIHN0cmljdCI7Zi53aGVuKCJBIiwiYS1zYyIsImEtY2FyZC1jb21wb25lbnQiLCJwcnY6YS1jYXJkLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcmQtbGlzdCIsZnVuY3Rpb24oZCxmLGcsaCl7ZnVuY3Rpb24gayhhKXtmb3IodmFyIGM9MDthOylpc05hTihhLm9mZnNldFRvcCl8fChjKz1hLm9mZnNldFRvcCksYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gY31mdW5jdGlvbiB0KGEpe2E9CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSk7dmFyIGM9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gayhhKStjLmhlaWdodH1mdW5jdGlvbiB4KGEpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgYj1jLnRhcmdldDthKGMsYi5zY3JvbGxUb3A+dj9oLkNBUkRfVVA6aC5DQVJEX0RPV04pO3Y9Yi5zY3JvbGxUb3B9fXZhciB2PTA7cmV0dXJuIGYuZGVmaW5lKHtjb21wb25lbnRzOntjYXJkczpnLnRvQ29sbGVjdGlvbigpfSxkYXRhOntoZWFkZXJTZWxlY3RvcjoiaGVhZGVyIixzZWxlY3RvcjpoLnNlbGVjdG9ycy5DQVJEX0xJU1QsY2FyZFNlbGVjdG9yOmguc2VsZWN0b3JzLkNBUkQsY2FudmFzVG9wOjAsY2FyZExpc3RTY3JvbGxUb3A6MCxjYXJkTGlzdFNjcm9sbFRvcERlbHRhOjAscGlubmVkSW5kZXg6bnVsbCxpc0R5bmFtaWNDYXJkSGVpZ2h0OiEwLGNhcmRTdGF0ZUNvbGxlY3Rpb246W119LGV2ZW50czp7InVpOnNjcm9sbC1jYXJkLWxpc3QiOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YS5zZXQoImNhcmRMaXN0U2Nyb2xsVG9wIiwKYSl9LCJ1aTp1cGRhdGUtY2FudmFzLXRvcCI6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhLnNldCgiY2FudmFzVG9wIixhKTt0aGlzLmJyb2FkY2FzdCgiY2FyZExpc3Q6dXBkYXRlLWNhbnZhcy10b3AiLGEpfSwidWk6cmVmcmVzaC1jYXJkIjpmdW5jdGlvbihhLGMpe3RoaXMuYnJvYWRjYXN0KCJjYXJkTGlzdDpyZWZyZXNoLWNhcmQiLGEsYyl9LCJjYXJkOnVwZGF0ZWQtcGlubmVkLWluZGV4IjpmdW5jdGlvbihhKXt0aGlzLmRhdGEuc2V0KCJwaW5uZWRJbmRleCIsYSl9LCJjYXJkOnNjcm9sbC1jYXJkLWxpc3QtdXAiOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YS5zZXQoImNhcmRMaXN0U2Nyb2xsVG9wRGVsdGEiLGEpfSwiY2FyZExpc3Q6dXBkYXRlLWRvbS1kYXRhIjpmdW5jdGlvbihhKXtmb3IodmFyIGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiZ0aGlzLmRhdGEuc2V0KGMsYVtjXSl9fSxsaWZlY3ljbGU6e3JlbmRlcjpmdW5jdGlvbigpe3RoaXMuZGF0YS5iaW5kKCJjYXJkTGlzdFNjcm9sbFRvcCIsCntiYXRjaDohMX0pO3RoaXMuZGF0YS5iaW5kKCJjYXJkTGlzdFNjcm9sbFRvcERlbHRhIix7YmF0Y2g6ITF9KTt2YXIgYT10KHRoaXMuZGF0YS5nZXQoImhlYWRlclNlbGVjdG9yIikpO3RoaXMuZGF0YS5zZXQoImNhbnZhc1RvcCIsYSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbGxlY3Rpb24oImNhcmRzIiksYz10aGlzLmRhdGEuZ2V0KCJjYXJkU3RhdGVDb2xsZWN0aW9uIiksYj10aGlzLmRhdGEuZ2V0KCJjYW52YXNUb3AiKSxlPXRoaXMuZGF0YS5nZXQoImlzRHluYW1pY0NhcmRIZWlnaHQiKTtkLmVhY2goYyxmdW5jdGlvbihjKXtjPWQuZXh0ZW5kKGMse2NhbnZhc1RvcDpiLGlzRHluYW1pY0NhcmRIZWlnaHQ6ZX0pO2EuYXBwZW5kKGMpfSk7cmV0dXJuIGEuc2hvdygpfX0sdmlldzp7cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRhdGEuZ2V0KCJzZWxlY3RvciIpKSxjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEucXVlcnlTZWxlY3RvckFsbCh0aGlzLmRhdGEuZ2V0KCJjYXJkU2VsZWN0b3IiKSkpOwp0aGlzLmRhdGEuZ2V0KCJjYW52YXNUb3AiKTt2YXIgYj10aGlzLmRhdGEuZ2V0KCJoZWFkZXJTZWxlY3RvciIpLGU9dGhpcyxmPVtdO2QuZWFjaChjLGZ1bmN0aW9uKGEsYil7YS5pZD1hLmlkfHwiYS1jYXJkLSIrYjtmLnB1c2goe2V4cGFuZGFibGU6YS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1leHBhbmRhYmxlIiksZXhwYW5kZWQ6YS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1leHBhbmRlZCIpLGhhc1BlZWs6YS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1oYXMtcGVlayIpLGlkOmEuaWQsaWR4OmIsc2VsZWN0b3I6IiMiK2EuaWR9KX0pO3RoaXMuZGlzcGF0Y2goImNhcmRMaXN0OnVwZGF0ZS1kb20tZGF0YSIse2NhcmRTdGF0ZUNvbGxlY3Rpb246Zn0pO3ZhciBnPXgoZnVuY3Rpb24oYSxiKXtkLmVhY2goYyxmdW5jdGlvbihhKXthLmNsYXNzTGlzdC5jb250YWlucygiYS1jYXJkLWV4cGFuZGVkIikmJmUuZGlzcGF0Y2goInVpOnJlZnJlc2gtY2FyZCIsYS5pZCwKYil9KX0pO2EuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixkLnRocm90dGxlKGcsMjApKTtxLmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIixmdW5jdGlvbigpe2QuYW5pbWF0aW9uRnJhbWVEZWxheShmdW5jdGlvbigpe3ZhciBhPXQoYik7ZS5kaXNwYXRjaCgidWk6dXBkYXRlLWNhbnZhcy10b3AiLGEpO3ZhciBkPWUuZGF0YS5nZXQoInBpbm5lZEluZGV4Iik7ZCYmKGE9ayhjW2RdKS1hLGUuZGlzcGF0Y2goInVpOnNjcm9sbC1jYXJkLWxpc3QiLGEpLGUuZGlzcGF0Y2goInVpOnNjcm9sbC1jYXJkLWxpc3QiLGEraC5DQVJEX1VQKSl9KX0pO3RoaXMuc2V0RWxlbWVudChhKX0sc2hvdzpmdW5jdGlvbihhKXtpZihhKXtkLnRyaWdnZXIoImNhcmQtbGlzdDp2aWV3OnNob3c6c3RhdGVzLWNoYW5nZSIse2NoYW5nZXM6YX0pO3ZhciBjPXRoaXMuZ2V0RWxlbWVudCgpO2EuY2FyZExpc3RTY3JvbGxUb3BEZWx0YSYmKGMuc2Nyb2xsVG9wKz10aGlzLmRhdGEuZ2V0KCJjYXJkTGlzdFNjcm9sbFRvcERlbHRhIikpOwphLmNhcmRMaXN0U2Nyb2xsVG9wJiYoYy5zY3JvbGxUb3A9dGhpcy5kYXRhLmdldCgiY2FyZExpc3RTY3JvbGxUb3AiKSl9fX19KX0pOyJ1c2Ugc3RyaWN0IjtmLndoZW4oIkEiLCJhLWNhcmQtbGlzdCIpLnJlZ2lzdGVyKCJhLWNhcmQiLGZ1bmN0aW9uKGQsZil7cmV0dXJue2luaXQ6ZnVuY3Rpb24oZCl7cmV0dXJuIGYuZ2V0SW5zdGFuY2UoZCkuc2hvdygpfX19KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24obil7dmFyIEM9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxFPUMuX25hbWVzcGFjZXx8Qy5hdHRyaWJ1dGVFcnJvcnMsZT1FP0UoIkFtYXpvblVJQ2Fyb3VzZWwiLCJBbWF6b25VSSIpOkM7ZS5ndWFyZEZhdGFsP2UuZ3VhcmRGYXRhbChuKShlLHdpbmRvdyk6ZS5leGVjdXRlKGZ1bmN0aW9uKCl7bihlLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKG4sQyxFKXtuLmRlY2xhcmUoImEtY2Fyb3VzZWwtY29uc3RhbnRzIix7QU5JTUFUSU5HOiJhbmltYXRpbmciLEFOSU1BVElPTl9TUEVFRDoiYW5pbWF0aW9uX3NwZWVkIixBVVRPX0FESlVTVF9IRUlHSFQ6ImF1dG9fYWRqdXN0X2hlaWdodCIsQ0lSQ1VMQVI6ImNpcmN1bGFyIixDVVJSRU5UX1BJWEVMOiJweCIsQ1VSUkVOVExZX1dSQVBQSU5HOiJjdXJyZW50bHlXcmFwcGluZyIsREVMQVlfVElNRToiZGVsYXlfdGltZSIsRUxFTUVOVF9DU1NfQ0xBU1M6ImVsZW1lbnRDc3NDbGFzcyIsRkVUQ0hFRF9JVEVNUzoiZmV0Y2hlZEl0ZW1zIiwKRklSU1RfVklTSUJMRV9JVEVNOiJmaXJzdFZpc2libGVJdGVtIixISURFX09GRl9TQ1JFRU46ImhpZGVfb2ZmX3NjcmVlbiIsSU5JVF9FVkVOVFM6ImE6cGFnZVVwZGF0ZSBiZWZvcmVSZWFkeSIsTE9BRElORzoibG9hZGluZyIsTUlOX0dVVFRFUjoibWluaW11bV9ndXR0ZXJfd2lkdGgiLE5BTUU6Im5hbWUiLE5PX1RSQU5TSVRJT046Im5vX3RyYW5zaXRpb24iLFBBR0VfTlVNQkVSOiJwYWdlTnVtYmVyIixQQUdFX1NJWkU6InBhZ2VTaXplIixQRUVLX0dSQURJRU5UOiJwZWVrX2dyYWRpZW50IixQRUVLX1BFUkNFTlRBR0U6InBlZWtfcGVyY2VudGFnZSIsUEVFS19XSURUSDoicGVla193aWR0aCIsU0VUX1NJWkU6InNldF9zaXplIixTUFJJTkdJTkVTUzoic3ByaW5naW5lc3MiLFNUQVRJQ19MT0FERVJfQ1NTX0NMQVNTOiJzdGF0aWNMb2FkZXJDc3NDbGFzcyIsVE9UQUxfUEFHRVM6InRvdGFsUGFnZXMiLFRPVUNIX0VBU0lORzoidG91Y2hfZWFzaW5nIixUUkFOU0lUSU9OX1NUUkFURUdZOiJ0cmFuc2l0aW9uU3RyYXRlZ3kiLApXUkFQX0VBU0lORzoid3JhcF9lYXNpbmcifSk7InVzZSBzdHJpY3QiO24ucmVnaXN0ZXIoImEtY2Fyb3VzZWwtdXRpbHMiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShkKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkfWZ1bmN0aW9uIGcoZCl7cmV0dXJuIGQmJnZvaWQgMCE9PWQubm9kZVR5cGV9ZnVuY3Rpb24gayhkKXtyZXR1cm4iIj09PWQ/Ilx4M2NkaXZceDNlXHgzYy9kaXZceDNlIjpkP2UoZCl8fGcoZCk/ZDprKGQuY29udGVudCk6bnVsbH1mdW5jdGlvbiBmKGQpe2QmJihlKGQpfHxnKGQpP2Q9ITA6ZC5jb250ZW50PWYoZC5jb250ZW50KSk7cmV0dXJuIGR9cmV0dXJue2FkZEVsZW1lbnRUb0RvbTpmdW5jdGlvbihkLGYpe2YmJihlKGYpP2QuaHRtbChmKTpnKGYpJiZkLmVtcHR5KCkuYXBwZW5kKGYpLCEwIT09ZiYmZC5yZW1vdmVDbGFzcygiYS1jYXJvdXNlbC1jYXJkLWVtcHR5IikpfSxjbGVhckVsZW1lbnRGcm9tSXRlbTpmLGdldEVsZW1lbnRGcm9tSXRlbTprLGlzRWxlbWVudDpnLAppc1N0cmluZzplfX0pOyJ1c2Ugc3RyaWN0IjtuLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWNpcmN1bGFyLXV0aWxzIixmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIGY9MDxlO3JldHVybiBmdW5jdGlvbihkLGUsbCl7dmFyIGI9ZS5sZW5ndGg7bD0obHx8MSklYjtkPWQuZ2V0KDApO2Zvcih2YXIgYyxhPTA7YTxsO2ErKylmPyhjPWUuZ2V0KGEpLGQuYXBwZW5kQ2hpbGQoYykpOihjPWUuZ2V0KGItMS1hKSxkLmluc2VydEJlZm9yZShjLGQuY2hpbGRyZW5bMF0pKX19ZnVuY3Rpb24gZyhlKXt2YXIgZj0wPGU7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7ZT1lP2UlZC5sZW5ndGg6MTtmP2Q9ZC5jb25jYXQoZC5zcGxpY2UoMCxlKSk6ZC51bnNoaWZ0LmFwcGx5KGQsZC5zcGxpY2UoZC5sZW5ndGgtZSxlKSk7cmV0dXJuIGR9fXJldHVybntyb3RhdGVDVzplKDEpLHJvdGF0ZUNDVzplKC0xKSxyb3RhdGVBcnJheUNXOmcoMSkscm90YXRlQXJyYXlDQ1c6ZygtMSksZmlyc3RDYXJkSW5kZXhBZnRlclJvdGF0ZTpmdW5jdGlvbihlLApmLGQpe2U9KGYrZSklZDswPT09ZT9lPWQ6MD5lJiYoZT1kK2UpO3JldHVybiBlfSxyZWxhdGl2ZUluZGV4RnJvbUluZGV4OmZ1bmN0aW9uKGUsZixkKXt2YXIgaD0xO2lmKDA8ZSYmZTw9ZClyZXR1cm4gZT5mP2g9ZS1mKzE6ZTxmJiYoaD1kLWYrZSsxKSxoO24uZXJyb3IoImlkeCBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAiK2QsImEtY2Fyb3VzZWwtY2lyY3VsYXItdXRpbHMiLCJyZWxhdGl2ZUluZGV4RnJvbUluZGV4Iil9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1tZWFzdXJlIixmdW5jdGlvbihlLGcpe3JldHVybiBmdW5jdGlvbihrKXtmdW5jdGlvbiBmKGQsZixiKXt2YXIgYyxhLHEsdTtmLmpxdWVyeXx8KGY9ZyhmKSk7Zm9yKGUuZWFjaChiLGZ1bmN0aW9uKHEpe2lmKCJ0b3AiPT09cXx8ImxlZnQiPT09cSlyZXR1cm4gYT1mLm9mZnNldCgpLCExfSk7dm9pZCAwIT09KGM9Yi5wb3AoKSk7KXE9ZFtjXSwibGVmdCI9PT0KY3x8InRvcCI9PT1jP2RbY109YVtjXTotMTxjLmluZGV4T2YoIm91dGVyIik/ZFtjXT1mW2NdKCEwKTpkW2NdPWZbIm91dGVyIitjLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Muc3Vic3RyKDEpXSgpLGRbY10hPT1xJiYodm9pZCAwPT09dSYmKHU9e30pLHVbY109cSk7cmV0dXJuIHV9dmFyIGQ9e2Nhcm91c2VsOntoZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfSx2aWV3cG9ydDp7aGVpZ2h0OjAsd2lkdGg6MCxvdXRlckhlaWdodDowLG91dGVyV2lkdGg6MH0saXRlbXM6W10sZ2V0Rmlyc3RDYXJkV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5pdGVtc1swXSYmZS5pc0Zpbml0ZU51bWJlcih0aGlzLml0ZW1zWzBdLndpZHRoKT90aGlzLml0ZW1zWzBdLndpZHRoOjE2MH19O2subWVhc3VyZT1mdW5jdGlvbihoKXt2YXIgbD10aGlzLmRvbS4kY2Fyb3VzZWwsYj10aGlzLmRvbS4kdmlld3BvcnQsYz17fTtoJiYoaD1oLnNwbGl0KCIgIikpOwppZighaHx8LTE8ZS5pbmRleE9mQXJyYXkoaCwiY2Fyb3VzZWwiKSljLmNhcm91c2VsPWYoZC5jYXJvdXNlbCxsLCJ0b3AgbGVmdCBoZWlnaHQgd2lkdGggb3V0ZXJIZWlnaHQgb3V0ZXJXaWR0aCIuc3BsaXQoIiAiKSk7aWYoIWh8fC0xPGUuaW5kZXhPZkFycmF5KGgsInZpZXdwb3J0IikpYy52aWV3cG9ydD1mKGQudmlld3BvcnQsYixbImhlaWdodCIsIndpZHRoIiwib3V0ZXJIZWlnaHQiLCJvdXRlcldpZHRoIl0pO2lmKCFofHwtMTxlLmluZGV4T2ZBcnJheShoLCJpdGVtcyIpKWQuaXRlbXM9W10sYy5pdGVtcz17fSxsLmNoaWxkcmVuKCJsaSIpLmVhY2goZnVuY3Rpb24oYSxxKXtkLml0ZW1zW2FdPXt9O3E9ZihkLml0ZW1zW2FdLHEsInRvcCBsZWZ0IGhlaWdodCB3aWR0aCBvdXRlckhlaWdodCBvdXRlcldpZHRoIi5zcGxpdCgiICIpKTt2b2lkIDAhPT1xJiYoYy5pdGVtc1thXT1xKX0pO3JldHVybiBjfTtrLmdldEl0ZW1PZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIGY9ZC5pdGVtczsKZS0tO2lmKGYmJmYubGVuZ3RoKXtpZihlPGYubGVuZ3RoKXtmb3IodmFyIGI9MCxjPWZbMF0ub3V0ZXJXaWR0aCxhPTA7YTxlO2ErKyliKz1mW2FdP2ZbYV0ub3V0ZXJXaWR0aDpjOzA8ZSYmdGhpcy5nZXRBdHRyKCJmaXJzdF9pdGVtX2ZsdXNoX2xlZnQiKSYmKGIrPWsuZ2V0QXR0cigiY3VycmVudEd1dHRlciIpKTtyZXR1cm4gYn19ZWxzZSByZXR1cm4gMH07ay5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGUuY29weShkKX07ay51cGRhdGVEaW1lbnNpb25zQ2FjaGU9ZnVuY3Rpb24oZil7ZS5leHRlbmQoZCxmKX07ay5nZXRWaWV3cG9ydFdpZHRoPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBkLnZpZXdwb3J0LndpZHRofWNhdGNoKGUpe319fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1hdHRyaWJ1dGVzIixmdW5jdGlvbihlLGcpe3JldHVybiBmdW5jdGlvbihrLGYpe3ZhciBkPXt9LGg9e30sbD17fTtlLmV4dGVuZChkLApmKTtrLm9uQ2hhbmdlPWZ1bmN0aW9uKGIsYyl7Yj1iLnNwbGl0KCIgIik7Zm9yKHZhciBhPWIubGVuZ3RoLHE7YS0tOylxPWJbYV0saFtxXXx8KGhbcV09W10pLGcuaXNGdW5jdGlvbihjKSYmLTE9PT1lLmluZGV4T2ZBcnJheShoW3FdLGMpJiZoW3FdLnB1c2goYyk7cmV0dXJuIHRoaXN9O2sudW5iaW5kPWZ1bmN0aW9uKGIsYyl7aFtiXSYmYyYmKGM9ZS5pbmRleE9mQXJyYXkoaFtiXSxjKSwtMTxjJiZoW2JdLnNwbGljZShjLDEpKTtyZXR1cm4gdGhpc307ay5vbmNlPWZ1bmN0aW9uKGIsYyl7dmFyIGE9ZnVuY3Rpb24oKXtjLmFwcGx5KG51bGwsYXJndW1lbnRzKTtrLnVuYmluZChiLGEpfTtyZXR1cm4gay5vbkNoYW5nZShiLGEpfTtrLnNldEF0dHI9ZnVuY3Rpb24oYixjLGEpe3ZhciBxPWRbYl07ZFtiXT1jO2lmKCEoYXx8bFtiXXx8ZS5lcXVhbHMoYyxxKSkpe2xbYl09ITA7Yz1lLmNvcHkoYyk7cT1lLmNvcHkocSk7aWYoaFtiXSl7YT1lLmNvcHkoaFtiXSk7Zm9yKHZhciB1PTAsCnA9YS5sZW5ndGg7dTxwO3UrKylhW3VdKGMscSxrLGIpfWM9e25ld1ZhbHVlOmMsb2xkVmFsdWU6cSxjYXJvdXNlbDprfTtlLnRyaWdnZXIoImE6Y2Fyb3VzZWw6Y2hhbmdlOiIrYixjKTtkLm5hbWUmJmUudHJpZ2dlcigiYTpjYXJvdXNlbDoiK2QubmFtZSsiOmNoYW5nZToiK2IsYyk7bFtiXT0hMX1yZXR1cm4gdGhpc307ay5nZXRBdHRyPWZ1bmN0aW9uKGIpe3JldHVybiBlLmNvcHkoZFtiXSl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLW1lYXN1cmUiLCJhLWNhcm91c2VsLWF0dHJpYnV0ZXMiLCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWJhc2UiLGZ1bmN0aW9uKGUsZyxrLGYsZCxoKXtmdW5jdGlvbiBsKGEpe3ZhciBjPWEuZ2V0QXR0cigic2V0X3NpemUiKTw9YS5nZXRBdHRyKCJwYWdlU2l6ZSIpLGI9YS5nZXRBdHRyKGguTk9fVFJBTlNJVElPTik7MT09PQphLmdldEF0dHIoInRvdGFsUGFnZXMiKSYmMTxhLmdldEF0dHIoInBhZ2VOdW1iZXIiKSYmYS5nb3RvUGFnZSgxLHtzdGFydG92ZXI6ITAsYW5pbWF0aW9uRHVyYXRpb246MH0pO2EuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtbGVmdCwgLmEtY2Fyb3VzZWwtcmlnaHQiKS5jc3MoInZpc2liaWxpdHkiLGN8fGI/ImhpZGRlbiI6InZpc2libGUiKX1mdW5jdGlvbiBiKGEsYyl7cmV0dXJuIGlzTmFOKGEpPyhuLmxvZygiYHNldF9zaXplYCBzaG91bGQgYmUgYW4gaW50ZWdlcjogIithLCJXQVJOIiwiYXVpOmNhcm91c2VsOmJhc2UiKSxjKTpwYXJzZUludChhLDEwKX1mdW5jdGlvbiBjKGEpe2Eub25DaGFuZ2UoInBhZ2VTaXplIixmdW5jdGlvbihjLGIpe3ZhciBlPWEuZ2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIpLGQ9TWF0aC5jZWlsKGUvYyk7MT09PWQmJjE8ZT9kPTI6MT5kJiYoZD0xKTthLnNldEF0dHIoInBhZ2VOdW1iZXIiLGQpO2Euc2V0QXR0cigidG90YWxQYWdlcyIsCk1hdGguY2VpbChhLmdldEF0dHIoInNldF9zaXplIikvYykpO2U9YS5nZXRBdHRyKCJhamF4Iik7Yz5iJiYoZSYmZS5wcmVmZXRjaF9uZXh0X3BhZ2U/YS5zdHJhdGVnaWVzLmFqYXgud2FudE5leHRQYWdlKGEpOmEuc3RyYXRlZ2llcy5hamF4LndhbnRDdXJyZW50UGFnZShhKSl9KTthLm9uQ2hhbmdlKCJzZXRfc2l6ZSIsZnVuY3Rpb24oYyxiKXt2YXIgZT1hLmdldEF0dHIoInBhZ2VTaXplIiksZD1hLmdldEF0dHIoImZldGNoZWRJdGVtcyIpO2Euc2V0QXR0cigidG90YWxQYWdlcyIsTWF0aC5jZWlsKGMvZSkpO2M8Yj8oZC5zcGxpY2UoYyxOdW1iZXIuTUFYX1ZBTFVFKSxhLnNldEF0dHIoImZldGNoZWRJdGVtcyIsZCkpOmEuc3RyYXRlZ2llcy5hamF4LndhbnRDdXJyZW50UGFnZSYmYS5zdHJhdGVnaWVzLmFqYXgud2FudEN1cnJlbnRQYWdlKGEpfSk7YS5vbkNoYW5nZSgiZmlyc3RWaXNpYmxlSXRlbSIsZnVuY3Rpb24oYyl7YS5kb20uJGNvbnRhaW5lci5maW5kKCJpbnB1dC5hLWNhcm91c2VsLWZpcnN0dmlzaWJsZWl0ZW0iKS52YWwoYyl9KTsKYS5vbkNoYW5nZSgicGFnZU51bWJlciIsZnVuY3Rpb24oYyl7MDxjJiZjPD1hLmdldEF0dHIoInRvdGFsUGFnZXMiKSYmYS5zZXRBdHRyKCJjdXJyZW50bHlXcmFwcGluZyIsITEpfSl9ZnVuY3Rpb24gYShhLGMsZCl7aWYoMCE9PWFyZ3VtZW50cy5sZW5ndGgpe2EuanF1ZXJ5fHwoYT1nKGEpKTt0aGlzLmRvbT17JGNvbnRhaW5lcjphLCR2aWV3cG9ydDphLmhhc0NsYXNzKCJhLWNhcm91c2VsLXZpZXdwb3J0Iik/YTphLmZpbmQoIi5hLWNhcm91c2VsLXZpZXdwb3J0IiksJGNhcm91c2VsOmEuZmluZCgiLmEtY2Fyb3VzZWwiKX07dmFyIG09e3RvdGFsUGFnZXM6MUUzLHBhZ2VOdW1iZXI6MSxwYWdlU2l6ZTowLGZpcnN0VmlzaWJsZUl0ZW06MSxtYWludGFpbl9zdGF0ZTohMCxweDowLGF1dG9fYWRqdXN0X2hlaWdodDohMCxhamF4Ont9fTtlLmV4dGVuZChtLGQpO20ubWFpbnRhaW5fc3RhdGU9ISFtLm1haW50YWluX3N0YXRlO20uaWRfbGlzdD9tLnNldF9zaXplfHwobS5zZXRfc2l6ZT0KbS5pZF9saXN0Lmxlbmd0aCk6bS5pZF9saXN0PVtdO3ZhciBsPXRoaXMuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKTtpZihtLnNldF9zaXplKW0uc2V0X3NpemU9YihtLnNldF9zaXplLGwubGVuZ3RoKTtlbHNle3ZhciBoPXBhcnNlSW50KGwuZmlyc3QoKS5hdHRyKCJhcmlhLXNldHNpemUiKSwxMCk7ZS5pc0Zpbml0ZU51bWJlcihoKSYmMDxoP20uc2V0X3NpemU9aDptLnNldF9zaXplPWwubGVuZ3RofXZhciByPVtdO3RoaXMuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5lYWNoKGZ1bmN0aW9uKGEsYyl7ci5wdXNoKGUudHJpbShjLmlubmVySFRNTCkpfSk7bS5mZXRjaGVkSXRlbXM9cjtrKHRoaXMpO2YodGhpcyxtKTt0aGlzLnN0cmF0ZWdpZXM9YztyZXR1cm4gdGhpc319ZS5lYWNoKGQsZnVuY3Rpb24oYyxiKXthLnByb3RvdHlwZVsic2V0IitiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSkrIlN0cmF0ZWd5Il09ZnVuY3Rpb24oYSl7dGhpcy5zdHJhdGVnaWVzW25hbWVdPQphOyJmdW5jdGlvbiI9PT10eXBlb2YgYS5pbml0JiZhLmluaXQodGhpcyl9fSk7ZD1hLnByb3RvdHlwZTtkLmdvdG9OZXh0UGFnZT1mdW5jdGlvbihhKXt0aGlzLmdldEF0dHIoInRyYW5zaXRpb25QYXVzZWQiKXx8KHRoaXMuc3RyYXRlZ2llcy50cmFuc2l0aW9uLmdvdG9OZXh0UGFnZSh0aGlzLGEpLGEmJmEuYWNjZXNzaWJsZVNhZmUmJnRoaXMuc3RyYXRlZ2llcy5hY2Nlc3NpYmlsaXR5Lm5leHRQYWdlKHRoaXMsYS5hbmltYXRpb25EdXJhdGlvbixhLmFuaW1hdGlvblNwZWVkKSl9O2QuZ290b1ByZXZQYWdlPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0QXR0cigidHJhbnNpdGlvblBhdXNlZCIpfHwodGhpcy5zdHJhdGVnaWVzLnRyYW5zaXRpb24uZ290b1ByZXZQYWdlKHRoaXMsYSksYSYmYS5hY2Nlc3NpYmxlU2FmZSYmdGhpcy5zdHJhdGVnaWVzLmFjY2Vzc2liaWxpdHkucHJldlBhZ2UodGhpcyxhLmFuaW1hdGlvbkR1cmF0aW9uLGEuYW5pbWF0aW9uU3BlZWQpKX07ZC5nb3RvUGFnZT0KZnVuY3Rpb24oYSxjKXt0aGlzLmdldEF0dHIoInRyYW5zaXRpb25QYXVzZWQiKXx8KHRoaXMuc3RyYXRlZ2llcy50cmFuc2l0aW9uLmdvdG9QYWdlKHRoaXMsYSxjKSxjJiZjLmFjY2Vzc2libGVTYWZlJiZ0aGlzLnN0cmF0ZWdpZXMuYWNjZXNzaWJpbGl0eS5nb3RvUGFnZSh0aGlzLGMuYW5pbWF0aW9uRHVyYXRpb24sYy5hbmltYXRpb25TcGVlZCkpfTtkLmdvdG9JbmRleD1mdW5jdGlvbihhLGMpeyghdGhpcy5nZXRBdHRyKCJ0cmFuc2l0aW9uUGF1c2VkIil8fGMmJmMuaWdub3JlUGF1c2UpJiZ0aGlzLnN0cmF0ZWdpZXMudHJhbnNpdGlvbi5nb3RvSW5kZXgodGhpcyxhLGMpfTtkLmdvdG9QaXhlbD1mdW5jdGlvbihhLGMpe3RoaXMuZ2V0QXR0cigidHJhbnNpdGlvblBhdXNlZCIpfHx0aGlzLnN0cmF0ZWdpZXMudHJhbnNpdGlvbi5nb3RvUGl4ZWwodGhpcyxhLGMpfTtkLnJlc2l6ZT1mdW5jdGlvbigpe2lmKHRoaXMuZG9tLiRjb250YWluZXIuaXMoIjp2aXNpYmxlIikpe3ZhciBhPQp0aGlzLm1lYXN1cmUoImNhcm91c2VsIHZpZXdwb3J0Iik7dGhpcy5zdHJhdGVnaWVzLmRpc3BsYXkucmVzaXplKHRoaXMsYSl9fTtkLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyKCJ0cmFuc2l0aW9uUGF1c2VkIiwhMCl9O2QucmVzdW1lPWZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyKCJ0cmFuc2l0aW9uUGF1c2VkIiwhMSl9O2QudHJpZ2dlckV2ZW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHx7fTtjLmNhcm91c2VsPXRoaXM7ZS50cmlnZ2VyKCJhOmNhcm91c2VsOiIrYSxjKTt2YXIgYj10aGlzLmdldEF0dHIoIm5hbWUiKTtiJiZlLnRyaWdnZXIoImE6Y2Fyb3VzZWw6IitiKyI6IithLGMpfTtkLmdldFN0YXRpY0xvYWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEF0dHIoaC5TVEFUSUNfTE9BREVSX0NTU19DTEFTUyk/J1x4M2NkaXYgY2xhc3NceDNkIicrdGhpcy5nZXRBdHRyKGguU1RBVElDX0xPQURFUl9DU1NfQ0xBU1MpKyciXHgzZVx4M2MvZGl2XHgzZSc6IiJ9O2QuZ2V0RW1wdHlDYXJkPQpmdW5jdGlvbihhLGMpe3ZhciBiPSJhLWNhcm91c2VsLWNhcmQgYS1jYXJvdXNlbC1jYXJkLWVtcHR5Ijt0aGlzLmdldEF0dHIoaC5FTEVNRU5UX0NTU19DTEFTUykmJihiPWIrIiAiK3RoaXMuZ2V0QXR0cihoLkVMRU1FTlRfQ1NTX0NMQVNTKSk7cmV0dXJuWydceDNjbGkgY2xhc3NceDNkIicsYiwnIiByb2xlXHgzZCJsaXN0aXRlbSIgYXJpYS1zZXRzaXplXHgzZCInLGMsJyIgYXJpYS1wb3NpbnNldFx4M2QiJyxhLCciXHgzZScsdGhpcy5nZXRTdGF0aWNMb2FkZXIoKSwiXHgzYy9saVx4M2UiXS5qb2luKCIiKX07ZC5pbml0VG91Y2hIYW5kbGluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1hLmRvbS4kdmlld3BvcnQ7KGUuY2FwYWJpbGl0aWVzLnRvdWNofHxlLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4KSYmbi53aGVuKCJhLXRvdWNoIikuZXhlY3V0ZShmdW5jdGlvbihiKXtjLmFkZENsYXNzKCJhLWdlc3R1cmUgYS1nZXN0dXJlLWhvcml6b250YWwiKS5iaW5kKCJwYW4taG9yaXpvbnRhbCBzd2lwZS1ob3Jpem9udGFsIiwKZnVuY3Rpb24oKXtyZXR1cm4hMX0pO2Uub24oImE6c3dpcGUtaG9yaXpvbnRhbDoiK2NbMF0uaWQsZnVuY3Rpb24oYyl7aWYoIWEuZ2V0QXR0cigidHJhbnNpdGlvblBhdXNlZCIpJiZhLnN0cmF0ZWdpZXMudHJhbnNpdGlvbi5vblN3aXBlKWEuc3RyYXRlZ2llcy50cmFuc2l0aW9uLm9uU3dpcGUoYSxjKX0pO2lmKCFhLmdldEF0dHIoImRpc2FibGVfcGFubmluZyIpKWUub24oImE6cGFuLWhvcml6b250YWw6IitjWzBdLmlkLGZ1bmN0aW9uKGMpe2lmKCFhLmdldEF0dHIoInRyYW5zaXRpb25QYXVzZWQiKSYmYS5zdHJhdGVnaWVzLnRyYW5zaXRpb24ub25QYW4pYS5zdHJhdGVnaWVzLnRyYW5zaXRpb24ub25QYW4oYSxjKX0pfSk7aWYoZS5jYXBhYmlsaXRpZXMuaXNJRTEwfHxlLmNhcGFiaWxpdGllcy5pc0lFMTFQbHVzKXt2YXIgYj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpO2EucHJldmVudERlZmF1bHQoKTtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwKYiwhMCl9O2MuYmluZChlLmFjdGlvbi5zdGFydCxmdW5jdGlvbihhKXtjLmJpbmQoInN3aXBlLWhvcml6b250YWwuYS1zc2llYyBwYW4taG9yaXpvbnRhbC5hLXNzaWVjIixmdW5jdGlvbihhKXtjLnVuYmluZCgiLmEtc3NpZWMiKTtjLmJpbmQoZS5hY3Rpb24uZW5kKyIuYS1zc2llYyIsZnVuY3Rpb24oYSl7Yy51bmJpbmQoIi5hLXNzaWVjIik7ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYiwhMCl9KX0pfSl9fTtkLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5zdHJhdGVnaWVzLGQ9YS5kb20uJHZpZXdwb3J0WzBdO2QmJiFkLmlkJiYoZC5pZD0iYW5vbkNhcm91c2VsIithLl9faWQpO2Zvcih2YXIgZD1hLmRvbS4kY2Fyb3VzZWxbMF0sZj1kLmNoaWxkTm9kZXMsaD1mLmxlbmd0aDtoLS07KWZbaF0udGFnTmFtZSYmImxpIj09PWZbaF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpfHxkLnJlbW92ZUNoaWxkKGZbaF0pO2UuZWFjaChhLnN0cmF0ZWdpZXMsCmZ1bmN0aW9uKGMpe2MuaW5pdEF0dHJzJiZlLmVhY2goYy5pbml0QXR0cnMsZnVuY3Rpb24oYyxiKXt2YXIgZT1jOyJmdW5jdGlvbiI9PT10eXBlb2YgYyYmKGU9YyhhLmdldEF0dHIoYikpKTthLnNldEF0dHIoYixlKX0pfSk7aWYoMT5hLmdldEF0dHIoInNldF9zaXplIikpcmV0dXJuIGIuYWpheC5pbml0KGEpLCExO2EubWVhc3VyZSgpO2UuZWFjaChhLnN0cmF0ZWdpZXMsZnVuY3Rpb24oYyl7Yy5pbml0KGEpfSk7Yj1hLmdldEF0dHIoInBhZ2VTaXplIik7ZD1hLmdldEF0dHIoInNldF9zaXplIik7YS5zZXRBdHRyKCJ0b3RhbFBhZ2VzIixNYXRoLmNlaWwoZC9iKSk7YyhhKTthLnNldEF0dHIoImlzSW5UYWIiLDA8YS5kb20uJGNvbnRhaW5lci5jbG9zZXN0KCIuYS10YWItY29udGVudCIpLmxlbmd0aCwhMCk7YS50cmlnZ2VyRXZlbnQoImluaXQiKTtlLmVhY2goYS5zdHJhdGVnaWVzLGZ1bmN0aW9uKGMpe2MuYWZ0ZXJJbml0JiZjLmFmdGVySW5pdChhKX0pO2EudHJpZ2dlckV2ZW50KCJhZnRlckluaXQiKTsKYj1hLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKTsxPT09YiYmYS5nZXRBdHRyKCJtYWludGFpbl9zdGF0ZSIpJiYoYj1wYXJzZUludChhLmRvbS4kY29udGFpbmVyLmZpbmQoImlucHV0LmEtY2Fyb3VzZWwtZmlyc3R2aXNpYmxlaXRlbSIpLnZhbCgpLDEwKSxlLmlzRmluaXRlTnVtYmVyKGIpJiYwPGImJmI8PWR8fChiPTEpKTtpZigxPGIpe2Q9NzAwO2Y9TWF0aC5jZWlsKGIvYS5nZXRBdHRyKCJwYWdlU2l6ZSIpKTtmb3IoaD0yO2g8ZjtoKyspZCs9NzAwL2g7YS5nb3RvSW5kZXgoYix7YW5pbWF0aW9uRHVyYXRpb246ZCxlYXNpbmdGdW5jdGlvbjoiZWFzZSJ9KX1sKHRoaXMpO2Eub25DaGFuZ2UoInBhZ2VTaXplIHNldF9zaXplIixmdW5jdGlvbigpe2woYSl9KTtiPWEuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtYnV0dG9uIik7Yi5sZW5ndGgmJihkPWIuZXEoMCkucG9zaXRpb24oKS50b3ArInB4IixiLmNzcygidG9wIixkKSk7dmFyIGs9ITEsZz1mdW5jdGlvbihjKXtjLnByZXZlbnREZWZhdWx0KCk7CmM9e3N0YXJ0b3ZlcjohMCxhY2Nlc3NpYmxlU2FmZToia2V5ZG93biI9PT1jLnR5cGU/ITA6ITF9OzU8YS5nZXRBdHRyKCJwYWdlTnVtYmVyIik/Yy5hbmltYXRpb25EdXJhdGlvbj0xMjUwOmMuYW5pbWF0aW9uU3BlZWQ9NSphLmdldERpbWVuc2lvbnMoKS52aWV3cG9ydC53aWR0aDthLmdvdG9QYWdlKDEsYyl9O2EuZG9tLiRjb250YWluZXIuZGVsZWdhdGUoIi5hLWNhcm91c2VsLWdvdG8tbmV4dHBhZ2UiLCJjbGljayBkYmxjbGljayIsZnVuY3Rpb24oYyl7a3x8KGs9ITAsYy5wcmV2ZW50RGVmYXVsdCgpLGEuZ290b05leHRQYWdlKCksZS5kZWxheShmdW5jdGlvbigpe2s9ITF9LDUpKX0pLmRlbGVnYXRlKCIuYS1jYXJvdXNlbC1nb3RvLXByZXZwYWdlIiwiY2xpY2sgZGJsY2xpY2siLGZ1bmN0aW9uKGMpe2t8fChrPSEwLGMucHJldmVudERlZmF1bHQoKSxhLmdvdG9QcmV2UGFnZSgpLGUuZGVsYXkoZnVuY3Rpb24oKXtrPSExfSw1KSl9KS5kZWxlZ2F0ZSgiLmEtY2Fyb3VzZWwtZ290by1uZXh0cGFnZSIsCiJrZXlkb3duIixmdW5jdGlvbihjKXtpZihjLndoaWNoPT09ZS5jb25zdGFudHMua2V5Y29kZXMuRU5URVJ8fGMud2hpY2g9PT1lLmNvbnN0YW50cy5rZXljb2Rlcy5TUEFDRSljLnByZXZlbnREZWZhdWx0KCksYS5nb3RvTmV4dFBhZ2Uoe2FjY2Vzc2libGVTYWZlOiEwfSl9KS5kZWxlZ2F0ZSgiLmEtY2Fyb3VzZWwtZ290by1wcmV2cGFnZSIsImtleWRvd24iLGZ1bmN0aW9uKGMpe2lmKGMud2hpY2g9PT1lLmNvbnN0YW50cy5rZXljb2Rlcy5FTlRFUnx8Yy53aGljaD09PWUuY29uc3RhbnRzLmtleWNvZGVzLlNQQUNFKWMucHJldmVudERlZmF1bHQoKSxhLmdvdG9QcmV2UGFnZSh7YWNjZXNzaWJsZVNhZmU6ITB9KX0pLmRlbGVnYXRlKCIuYS1jYXJvdXNlbC1yZXN0YXJ0Iiwia2V5ZG93biIsZnVuY3Rpb24oYSl7YS53aGljaCE9PWUuY29uc3RhbnRzLmtleWNvZGVzLkVOVEVSJiZhLndoaWNoIT09ZS5jb25zdGFudHMua2V5Y29kZXMuU1BBQ0V8fGcoYSl9KS5kZWxlZ2F0ZSgiLmEtY2Fyb3VzZWwtcmVzdGFydCIsCiJjbGljayIsZyk7YS5kb20uJGNvbnRhaW5lci5maW5kKCIuYS1jYXJvdXNlbC1wYWdlLW1heCIpLmh0bWwodGhpcy5nZXRBdHRyKCJ0b3RhbFBhZ2VzIikpO3JldHVybiEwfTtyZXR1cm4gYX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLWJhc2UiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLW1vYmlsZSIsZnVuY3Rpb24oZSxnLGssZil7ZnVuY3Rpb24gZChiKXt2YXIgYz1iLmdldEF0dHIoImxvYWRlckhlaWdodCIpO2N8fCgoYz1iLmdldEF0dHIoIm1heEhlaWdodCIpKT8oYz1NYXRoLm1pbiguOSpjLDkwKSxjPU1hdGgubWF4KGMsMTIwKSk6Yz05MCxiLnNldEF0dHIoImxvYWRlckhlaWdodCIsYykpO3JldHVybiBjfWZ1bmN0aW9uIGgoYixjLGEpe2suY2FsbCh0aGlzLGIsYyxhKTtpZigwIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5nZXRBdHRyKCJjaXJjdWxhciIpPT09bCYmdGhpcy5zZXRBdHRyKCJjaXJjdWxhciIsCiExKSx0aGlzLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0Iik9PT1sJiZ0aGlzLnNldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiwhMCksdGhpcy5nZXRBdHRyKCJoaWRlX29mZl9zY3JlZW4iKT09PWwmJnRoaXMuc2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIiwhMSksdGhpcy5nZXRBdHRyKCJzcHJpbmdpbmVzcyIpPT09bCYmdGhpcy5zZXRBdHRyKCJzcHJpbmdpbmVzcyIsLjgpLHRoaXMuZ2V0QXR0cigidG91Y2hfZWFzaW5nIik9PT1sJiZ0aGlzLnNldEF0dHIoInRvdWNoX2Vhc2luZyIsImN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCkiKSx0aGlzLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gay5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpPyh0aGlzLmdldEF0dHIoZi5TVEFUSUNfTE9BREVSX0NTU19DTEFTUyl8fHRoaXMuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5jaGlsZHJlbigiLmEtbG9hZGluZy1zdGF0aWMiKS5jc3MoImhlaWdodCIsZCh0aGlzKSsKInB4IiksdGhpcy5nZXRBdHRyKGYuTk9fVFJBTlNJVElPTil8fHRoaXMuaW5pdFRvdWNoSGFuZGxpbmcoKSwhMCk6ITF9LHRoaXN9dmFyIGw7aC5wcm90b3R5cGU9bmV3IGs7aC5wcm90b3R5cGUuY29uc3RydWN0b3I9aDtoLnByb3RvdHlwZS5nZXRTdGF0aWNMb2FkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBdHRyKGYuU1RBVElDX0xPQURFUl9DU1NfQ0xBU1MpPydceDNjZGl2IGNsYXNzXHgzZCInK3RoaXMuZ2V0QXR0cihmLlNUQVRJQ19MT0FERVJfQ1NTX0NMQVNTKSsnIlx4M2VceDNjL2Rpdlx4M2UnOidceDNjZGl2IGNsYXNzXHgzZCJhLWxvYWRpbmctc3RhdGljIiBzdHlsZVx4M2QiaGVpZ2h0OicrZCh0aGlzKSsncHgiXHgzZVx4M2NkaXYgY2xhc3NceDNkImEtbG9hZGluZy1zdGF0aWMtaW5uZXIiXHgzZVx4M2MvZGl2XHgzZVx4M2MvZGl2XHgzZSd9O3JldHVybiBofSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsImEtY2Fyb3VzZWwtYmFzZSIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtZGVza3RvcCIsCmZ1bmN0aW9uKGUsZyxrLGYpe2Z1bmN0aW9uIGQoYil7dmFyIGM9Yi5nZXRBdHRyKCJzZXRfc2l6ZSIpPD1iLmdldEF0dHIoInBhZ2VTaXplIiksYT1iLmdldEF0dHIoZi5OT19UUkFOU0lUSU9OKTtiLmRvbS4kY29udGFpbmVyLmZpbmQoIi5hLWNhcm91c2VsLXBhZ2luYXRpb24iKS5jc3MoInZpc2liaWxpdHkiLGN8fGE/ImhpZGRlbiI6InZpc2libGUiKX1mdW5jdGlvbiBoKGIsYyxhKXtrLmNhbGwodGhpcyxiLGMsYSk7aWYoMCE9PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPXRoaXM7ZS5nZXRBdHRyKCJjaXJjdWxhciIpPT09bCYmdGhpcy5zZXRBdHRyKCJjaXJjdWxhciIsITApO2UuZ2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIik9PT1sJiZ0aGlzLnNldEF0dHIoImhpZGVfb2ZmX3NjcmVlbiIsITApO2Uub25DaGFuZ2UoInRvdGFsUGFnZXMiLGZ1bmN0aW9uKGEpe2UuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtcGFnZS1tYXgiKS5odG1sKGEpO2E8ZS5nZXRBdHRyKCJwYWdlTnVtYmVyIikmJgplLmdvdG9QYWdlKGEpfSk7ZS5vbkNoYW5nZSgicGFnZU51bWJlciIsZnVuY3Rpb24oYSxjKXtjPWUuZG9tLiRjb250YWluZXI7dmFyIGI9Yy5maW5kKCIuYS1jYXJvdXNlbC1yZXN0YXJ0LWNvbnRhaW5lciIpOzE8YT9iLnNob3coKTpiLmhpZGUoKTtjLmZpbmQoIi5hLWNhcm91c2VsLXBhZ2UtY3VycmVudCIpLmh0bWwoYSl9KTtlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBrLnByb3RvdHlwZS5pbml0LmNhbGwoYSk/KGQodGhpcyksYS5vbkNoYW5nZSgicGFnZVNpemUgc2V0X3NpemUiLGZ1bmN0aW9uKCl7ZChhKX0pLDI+YS5nZXRBdHRyKCJwYWdlTnVtYmVyIikmJmEuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtcmVzdGFydC1jb250YWluZXIiKS5oaWRlKCksYS5nZXRBdHRyKGYuTk9fVFJBTlNJVElPTil8fGEuaW5pdFRvdWNoSGFuZGxpbmcoKSwhMCk6ITF9O3JldHVybiBlfX12YXIgbDtoLnByb3RvdHlwZT1uZXcgaztyZXR1cm4gaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Cmh9KTsidXNlIHN0cmljdCI7bi53aGVuKCJBIiwiYS1jYXJvdXNlbC1kZXNrdG9wIiwiYS1jYXJvdXNlbC1tb2JpbGUiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1jbGFzc2VzIixmdW5jdGlvbihlLGcsayl7cmV0dXJue2Rlc2t0b3A6Zyxtb2JpbGU6aywiZGVmYXVsdCI6ZS5jYXBhYmlsaXRpZXMubW9iaWxlfHxlLmNhcGFiaWxpdGllcy50YWJsZXQ/Im1vYmlsZSI6ImRlc2t0b3AifX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJwLWRldGVjdCIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtc3RyZXRjaHlnb29kbmVzcyIsZnVuY3Rpb24oZSxnLGssZil7ZnVuY3Rpb24gZChhLGMsYixkKXthLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IikmJihjLT1iLzEwKTt2YXIgZj1hLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIik7YS5nZXRBdHRyKCJzZXRfc2l6ZSIpO2E9MDtmb3IodmFyIGw9ITA7MDxjOylhKyssYz1kJiZsPwpjLWI6Yy0oYitmKSxsPSExOzA+YyYmYS0tO3JldHVybiBlLmlzRmluaXRlTnVtYmVyKGEpJiYwPGE/YToxfWZ1bmN0aW9uIGgoYSxjLGIsZCxmLGwsaCl7InN0cmV0Y2giPT09YS5nZXRBdHRyKCJzaW5nbGVfcGFnZV9hbGlnbiIpJiZkPmwmJihkPWwpO2MtPWIqZDthLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0Iik/KGE9Yy1mKihkKzEpLGgmJihhKz1mKSxoPWEvYixjLT1iKiguNTxoPy41OmgpKTpoJiYoYys9Zik7Yj1NYXRoLmNlaWwoYy8oZCsxKSk7aWYoIWUuaXNGaW5pdGVOdW1iZXIoYil8fGI8ZiliPWY7cmV0dXJuIGJ9ZnVuY3Rpb24gbChhKXtpZihhLmdldEF0dHIoImF1dG9fYWRqdXN0X2hlaWdodCIpKWlmKGEuZ2V0QXR0cigiYW5pbWF0aW5nIikpYS5vbmNlKCJhbmltYXRpbmciLGZ1bmN0aW9uKCl7bChhKX0pO2Vsc2V7dmFyIGM9YS5nZXRBdHRyKCJtYXhIZWlnaHQiKSxiPWEuZ2V0RGltZW5zaW9ucygpO2MmJmUuaXNGaW5pdGVOdW1iZXIoYyl8fChjPTEpO3ZhciBkPQpjLGY9YS5nZXRBdHRyKCJwYWdlU2l6ZSIpLGg9ZiooYS5nZXRBdHRyKCJwYWdlTnVtYmVyIiktMSksZj1oK2YtMSxiPWIuaXRlbXMsaz1iLmxlbmd0aCxnO2ZvcihhLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IikmJmYrKztoPD1mJiZoPGs7aCsrKShnPWJbaF0pJiZnLm91dGVySGVpZ2h0PmQmJihkPWJbaF0ub3V0ZXJIZWlnaHR8fGJbaF0uaGVpZ2h0KTtkPmMmJihhLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7dmlld3BvcnQ6e2hlaWdodDpkLG91dGVySGVpZ2h0OmR9fSksYS5zZXRBdHRyKCJtYXhIZWlnaHQiLGQpLDE9PT1jP2EuZG9tLiR2aWV3cG9ydC5oZWlnaHQoZCk6ZS5hbmltYXRlKGEuZG9tLiR2aWV3cG9ydCx7aGVpZ2h0OmR9LGEuZ2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIpLCJsaW5lYXIiKSl9ZWxzZSBhLmRvbS4kdmlld3BvcnQuY3NzKCJoZWlnaHQiLCIiKX1mdW5jdGlvbiBiKGEpe2Eub25DaGFuZ2UoInBhZ2VOdW1iZXIiLGZ1bmN0aW9uKCl7YS5nZXRBdHRyKCJoaWRlX29mZl9zY3JlZW4iKSYmCmEuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5jc3MoInZpc2liaWxpdHkiLCIiKX0pO2Eub25DaGFuZ2UoInBhZ2VTaXplIixmdW5jdGlvbihjLGIpe2M+YiYmbChhKX0pO2Eub25DaGFuZ2UoImxvYWRpbmciLGZ1bmN0aW9uKGMpe2N8fGwoYSl9KTthLm9uQ2hhbmdlKCJmaXJzdFZpc2libGVJdGVtIixmdW5jdGlvbigpe2woYSl9KTthLm9uQ2hhbmdlKCJhbmltYXRpbmciLGZ1bmN0aW9uKGMpe2lmKCFjJiZhLmdldEF0dHIoImhpZGVfb2ZmX3NjcmVlbiIpKXt2YXIgYj1hLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKS0xLGU9YithLmdldEF0dHIoInBhZ2VTaXplIiktMTthLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IikmJmUrKzthLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuZWFjaChmdW5jdGlvbihhLGMpe2E9YT49YiYmYTw9ZTtnKGMpLmNzcygidmlzaWJpbGl0eSIsYT8iIjoiaGlkZGVuIil9KX19KTthLm9uQ2hhbmdlKCJzaW5nbGVfcGFnZV9hbGlnbiBtaW5pbXVtX2d1dHRlcl93aWR0aCIsCmZ1bmN0aW9uKCl7YyhhKX0pO2Eub25DaGFuZ2UoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixmdW5jdGlvbigpe2MoYSl9KX1mdW5jdGlvbiBjKGEpe3ZhciBjPWEuZ2V0RGltZW5zaW9ucygpLGI9Yy52aWV3cG9ydC53aWR0aCxjPWMuZ2V0Rmlyc3RDYXJkV2lkdGgoKSxlPWEuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKSxmPWEuZ2V0QXR0cigic2V0X3NpemUiKSxsPWEuZ2V0QXR0cigiZmlyc3RfaXRlbV9mbHVzaF9sZWZ0Iiksaz1kKGEsYixjLGwpLGc9aChhLGIsYyxrLGUsZixsKTthLnNldEF0dHIoImN1cnJlbnRHdXR0ZXIiLGcpO2Euc2V0QXR0cigicGFnZVNpemUiLGspO3ZhciB0PWEuZG9tLiRjYXJvdXNlbCx4PXQuY2hpbGRyZW4oImxpIiksZT14Lmxlbmd0aCx3PWEuZ2V0QXR0cigidG90YWxQYWdlcyIpLHo9YS5nZXRBdHRyKCJwYWdlTnVtYmVyIikseT1hLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKSxuPSh6LTEpKmsrMTt6Pnc/KHk9KHctMSkqaysxLGEuc2V0QXR0cigicGFnZU51bWJlciIsCncpLGEuc2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIseSkpOnkhPT1uJiYodz1NYXRoLmNlaWwoeS9rKSx5PSh3LTEpKmsrMSxhLnNldEF0dHIoInBhZ2VOdW1iZXIiLHcpLGEuc2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIseSkpO3ZhciBGPXktMSxCPUYray0xO2EuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSYmQisrO3ZhciBIPWEuZ2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIiksST1nKyJweCIsSj1jKyJweCIsRzt4LmVhY2goZnVuY3Rpb24oYSxjKXtHPSFIfHxhPj1GJiZhPD1CO2Muc3R5bGUubWFyZ2luTGVmdD1sJiYwPT09YT8wOkk7Yy5zdHlsZS52aXNpYmlsaXR5PUc/IiI6ImhpZGRlbiI7Yy5zdHlsZS53aWR0aD1KfSk7dmFyIEQ7YS5nZXRBdHRyKCJmaXJzdF9pdGVtX2ZsdXNoX2xlZnQiKT8oZz14LmZpcnN0KCkub3V0ZXJXaWR0aCghMCksMTx4Lmxlbmd0aCYmKEQ9eC5lcSgxKS5vdXRlcldpZHRoKCEwKSksdz0oZS0xKSpEK2cpOihnPUQ9eC5maXJzdCgpLm91dGVyV2lkdGgoITApLAp3PWUqRCk7az49Zj8odz1iLHo9YS5nZXRBdHRyKCJzaW5nbGVfcGFnZV9hbGlnbiIpLHQudG9nZ2xlQ2xhc3MoImEtdGV4dC1yaWdodCIsInJpZ2h0Ij09PXopLHQudG9nZ2xlQ2xhc3MoImEtdGV4dC1jZW50ZXIiLCJjZW50ZXIiPT09eiksImNlbnRlciI9PT16JiZ4LmZpcnN0KCkuY3NzKCJtYXJnaW4tbGVmdCIsMCkpOnQucmVtb3ZlQ2xhc3MoImEtdGV4dC1yaWdodCBhLXRleHQtY2VudGVyIik7dz1rPj1mP2I6dzt0LmNzcygid2lkdGgiLHcrInB4Iik7Yj17Y2Fyb3VzZWw6e3dpZHRoOncsb3V0ZXJXaWR0aDp0Lm91dGVyV2lkdGgoKX0saXRlbXM6W119O2ZvcihmPTA7ZjxlO2YrKyliLml0ZW1zLnB1c2goe3dpZHRoOmMsb3V0ZXJXaWR0aDowPT09Zj9nOkR9KTthLnVwZGF0ZURpbWVuc2lvbnNDYWNoZShiKTthLmdvdG9JbmRleCh5LHthbmltYXRpb25EdXJhdGlvbjowLGlnbm9yZVBhdXNlOiEwfSk7YS50cmlnZ2VyRXZlbnQoInJlcGFpbnQiKX1yZXR1cm57cmVwYWludDpjLGluaXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9CmEuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKTtlLmlzRmluaXRlTnVtYmVyKGQpfHwoZD0xNSxhLnNldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixkKSk7YS5zZXRBdHRyKCJjdXJyZW50R3V0dGVyIixkKTtkPWEuZ2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIpO2UuaXNGaW5pdGVOdW1iZXIoZCl8fGEuc2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIsMjAwKTthLnNldEF0dHIoImZpcnN0X2l0ZW1fZmx1c2hfbGVmdCIsISFhLmdldEF0dHIoImZpcnN0X2l0ZW1fZmx1c2hfbGVmdCIpKTthLnNldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiwhIWEuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSk7YyhhKTthLmdldEF0dHIoZi5OT19UUkFOU0lUSU9OKXx8bChhKTtkPWEuZ2V0RGltZW5zaW9ucygpO2EuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtbGVmdCwgLmEtY2Fyb3VzZWwtcmlnaHQsIC5hLWNhcm91c2VsLXZpZXdwb3J0IikuY3NzKCJoZWlnaHQiLApNYXRoLm1heChkLnZpZXdwb3J0LmhlaWdodCxkLml0ZW1zWzBdP2QuaXRlbXNbMF0uaGVpZ2h0OjApKyJweCIpO2Q9YS5nZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIik7MTxkJiYoYS5zZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIixkKSxkPU1hdGguY2VpbChkL2EuZ2V0QXR0cigicGFnZVNpemUiKSksYS5nb3RvUGFnZShkKSk7YihhKX0scmVzaXplOmZ1bmN0aW9uKGEsYil7Yi52aWV3cG9ydCYmdm9pZCAwIT09Yi52aWV3cG9ydC53aWR0aCYmYyhhKX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsInAtZGV0ZWN0IiwiYS1jYXJvdXNlbC11dGlscyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWRpc3BsYXktc3dhcCIsZnVuY3Rpb24oZSxnLGssZil7ZnVuY3Rpb24gZChjKXtpZihjLmdldEF0dHIoImF1dG9fYWRqdXN0X2hlaWdodCIpKXt2YXIgYT1jLmdldEF0dHIoIm1heEhlaWdodCIpO2EmJmUuaXNGaW5pdGVOdW1iZXIoYSl8fChhPTEpO3ZhciBiPWE7Yy5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLm5vdCgiLmEtY2Fyb3VzZWwtY2FyZC1lbXB0eSIpLmVhY2goZnVuY3Rpb24oYSwKYyl7YT1nKGMpLm91dGVySGVpZ2h0KCk7Yj1NYXRoLm1heChhLGIpfSk7Yj5hJiYoYy5zZXRBdHRyKCJtYXhIZWlnaHQiLGIpLGsuY2FwYWJpbGl0aWVzLnRyYW5zaXRpb24/MT09PWE/Yy5kb20uJHZpZXdwb3J0LmhlaWdodChiKTplLmFuaW1hdGUoYy5kb20uJHZpZXdwb3J0LHtoZWlnaHQ6Yn0sYy5nZXRBdHRyKCJoZWlnaHRfYW5pbWF0aW9uX3NwZWVkIiksImxpbmVhciIpOmMuZG9tLiR2aWV3cG9ydC5oZWlnaHQoYiksYy51cGRhdGVEaW1lbnNpb25zQ2FjaGUoe3ZpZXdwb3J0OntoZWlnaHQ6YixvdXRlckhlaWdodDpifX0pKX1lbHNlIGMuZG9tLiR2aWV3cG9ydC5jc3MoImhlaWdodCIsIiIpfWZ1bmN0aW9uIGgoYyxhKXt2YXIgYj1jLmRvbS4kY2Fyb3VzZWxbMF07Yz1jLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuZ2V0KCk7Zm9yKHZhciBkO2MubGVuZ3RoPmE7KWQ9Yy5wb3AoKSxiLnJlbW92ZUNoaWxkKGQpfWZ1bmN0aW9uIGwoYyl7Yy5vbkNoYW5nZSgiYW5pbWF0aW5nIiwKZnVuY3Rpb24oYSl7YXx8ZChjKX0pO2Mub25DaGFuZ2UoImxvYWRpbmciLGZ1bmN0aW9uKGEpe2F8fGQoYyl9KTtjLm9uQ2hhbmdlKCJwYWdlU2l6ZSIsZnVuY3Rpb24oYSxiKXtpZihhPmIpezA9PT1iJiZoKGMpO2I9Yy5nZXRBdHRyKCJzZXRfc2l6ZSIpO3ZhciBlPWMuZ2V0RGltZW5zaW9ucygpLmdldEZpcnN0Q2FyZFdpZHRoKCksbD1jLmdldEF0dHIoImN1cnJlbnRHdXR0ZXIiKSxtPWMuZ2V0QXR0cigiZmV0Y2hlZEl0ZW1zIiksaz1jLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKS0xLHY9Yy5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLHI9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHQ7aWYoZy5pc0FycmF5KG0pKXtmb3IodmFyIHg9di5sZW5ndGg7eDxhO3grKyl0PXgrayx2PWcoWydceDNjbGkgY2xhc3NceDNkImEtY2Fyb3VzZWwtY2FyZCBhLWNhcm91c2VsLWNhcmQtZW1wdHkiIHJvbGVceDNkImxpc3RpdGVtIiBhcmlhLXNldHNpemVceDNkIicsCmIsJyIgYXJpYS1wb3NpbnNldFx4M2QiJyx0KzEsJyIgc3R5bGVceDNkIndpZHRoOicsZSwicHg7IG1hcmdpbi1sZWZ0OiIsbCwncHg7Ilx4M2UnLGMuZ2V0U3RhdGljTG9hZGVyKCldLmpvaW4oIiIpKSxtW3RdJiZmLmFkZEVsZW1lbnRUb0RvbSh2LGYuZ2V0RWxlbWVudEZyb21JdGVtKG1bdF0pKSx0Pj1iJiZ2LnJlbW92ZUNsYXNzKCJhLWNhcm91c2VsLWNhcmQtZW1wdHkiKSxyLmFwcGVuZENoaWxkKHZbMF0pO2MuZG9tLiRjYXJvdXNlbC5hcHBlbmQocil9ZChjKX1lbHNlIGE8YiYmaChjKX0pO2Mub25DaGFuZ2UoInNldF9zaXplIixmdW5jdGlvbihhLGQpe3ZhciBmPWMuZ2V0QXR0cigicGFnZU51bWJlciIpLGw9Yy5nZXRBdHRyKCJ0b3RhbFBhZ2VzIiksaD1jLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIik7Zj09PWwmJmE+ZCYmKGgubGVuZ3RoJiZjLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuZWFjaChmdW5jdGlvbihhLGIpe2UudHJpbShiLmlubmVySFRNTCl8fAooYi5jbGFzc05hbWUrPSIgYS1jYXJvdXNlbC1jYXJkLWVtcHR5IixiLmlubmVySFRNTD1jLmdldFN0YXRpY0xvYWRlcigpKX0pLDA9PT1kJiZiKGMpKX0pO2Mub25DaGFuZ2UoInNpbmdsZV9wYWdlX2FsaWduIG1pbmltdW1fZ3V0dGVyX3dpZHRoIixmdW5jdGlvbigpe2IoYyl9KTtjLm9uQ2hhbmdlKCJtaW5pbXVtX2d1dHRlcl93aWR0aCIsZnVuY3Rpb24oKXtiKGMpfSl9ZnVuY3Rpb24gYihjKXt2YXIgYT1jLmdldERpbWVuc2lvbnMoKSxiPWEudmlld3BvcnQud2lkdGgsZD1hLmdldEZpcnN0Q2FyZFdpZHRoKCksZj1jLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIiksYT1jLmdldEF0dHIoInNldF9zaXplIiksbDtsPWMuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKTtjLmdldEF0dHIoInNldF9zaXplIik7bD1NYXRoLm1heChNYXRoLmZsb29yKGIvKGQrbCkpLDEpO2w9ZS5pc0Zpbml0ZU51bWJlcihsKT9sOjE7dmFyIGssZz1sOyJzdHJldGNoIj09PWMuZ2V0QXR0cigic2luZ2xlX3BhZ2VfYWxpZ24iKSYmCmc+YSYmKGc9YSk7Zz1NYXRoLmNlaWwoKGItZCpnKS8oZysxKSk7ZS5pc0Zpbml0ZU51bWJlcihnKXx8KGc9Zik7az1nO2Muc2V0QXR0cigiY3VycmVudEd1dHRlciIsayk7Yy5zZXRBdHRyKCJwYWdlU2l6ZSIsbCk7dmFyIGc9Yy5kb20uJGNhcm91c2VsLHI9Zy5jaGlsZHJlbigibGkiKSxmPXIubGVuZ3RoLGQ9ZCtrLHQ9ZipkO2goYyxNYXRoLm1pbihsLGEpKTtyLmNzcygibWFyZ2luLWxlZnQiLGsrInB4Iik7bD49YT8odD1iLGI9Yy5nZXRBdHRyKCJzaW5nbGVfcGFnZV9hbGlnbiIpLGcudG9nZ2xlQ2xhc3MoImEtdGV4dC1yaWdodCIsInJpZ2h0Ij09PWIpLGcudG9nZ2xlQ2xhc3MoImEtdGV4dC1jZW50ZXIiLCJjZW50ZXIiPT09YiksImNlbnRlciI9PT1iJiZyLmZpcnN0KCkuY3NzKCJtYXJnaW4tbGVmdCIsMCkpOmcucmVtb3ZlQ2xhc3MoImEtdGV4dC1yaWdodCBhLXRleHQtY2VudGVyIik7Zm9yKGI9e2Nhcm91c2VsOnt3aWR0aDp0LG91dGVyV2lkdGg6Zy5vdXRlcldpZHRoKCl9LAppdGVtczpbXX07Zi0tOyliLml0ZW1zLnB1c2goe291dGVyV2lkdGg6ZH0pO2MudXBkYXRlRGltZW5zaW9uc0NhY2hlKGIpO2MudHJpZ2dlckV2ZW50KCJyZXBhaW50Iil9cmV0dXJue3JlcGFpbnQ6Yixpbml0OmZ1bmN0aW9uKGMpe3ZhciBhPWMuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKTthfHwoYT0xNSxjLnNldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixhKSk7Yy5zZXRBdHRyKCJjdXJyZW50R3V0dGVyIixhKTthPWMuZ2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIpO2UuaXNGaW5pdGVOdW1iZXIoYSl8fGMuc2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIsMjAwKTtsKGMpO2IoYyk7YT1jLmdldERpbWVuc2lvbnMoKTtjLmRvbS4kY29udGFpbmVyLmZpbmQoIi5hLWNhcm91c2VsLWxlZnQsIC5hLWNhcm91c2VsLXJpZ2h0LCAuYS1jYXJvdXNlbC12aWV3cG9ydCIpLmNzcygiaGVpZ2h0IixNYXRoLm1heChhLnZpZXdwb3J0LmhlaWdodCxhLml0ZW1zWzBdPwphLml0ZW1zWzBdLmhlaWdodDowKSsicHgiKTthPWMuZ2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIpOzE8YSYmKGMuc2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIsYSksYT1NYXRoLmNlaWwoYS9jLmdldEF0dHIoInBhZ2VTaXplIikpLGMuZ290b1BhZ2UoYSkpfSxyZXNpemU6ZnVuY3Rpb24oYyxhKXthLnZpZXdwb3J0JiZ2b2lkIDAhPT1hLnZpZXdwb3J0LndpZHRoJiZiKGMpfX19KTsidXNlIHN0cmljdCI7bi53aGVuKCJBIiwialF1ZXJ5IikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtZGlzcGxheS1zaW5nbGUiLGZ1bmN0aW9uKGUsZyl7ZnVuY3Rpb24gayhkKXtpZihkLmdldEF0dHIoImF1dG9fYWRqdXN0X2hlaWdodCIpKWlmKGQuZ2V0QXR0cigiYW5pbWF0aW5nIikpZC5vbmNlKCJhbmltYXRpbmciLGZ1bmN0aW9uKCl7ayhkKX0pO2Vsc2UgZC5kb20uJHZpZXdwb3J0LmNzcygiaGVpZ2h0IiwiYXV0byIpLGUuZGVsYXkoZnVuY3Rpb24oKXtkLmRvbS4kdmlld3BvcnQuaGVpZ2h0KGQuZG9tLiR2aWV3cG9ydC5oZWlnaHQoKSl9LAowKTtlbHNlIGQuZG9tLiR2aWV3cG9ydC5jc3MoImhlaWdodCIsIiIpfWZ1bmN0aW9uIGYoZCxiKXt2YXIgYz1kLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksYT1kLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKS0xO2Q9ZC5nZXRBdHRyKCJzaG93X3BhcnRpYWxfbmV4dCIpPzI6MTthPWMuc2xpY2UoYSxhK2QpO2Mubm90KGEpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpO2ImJmEuY3NzKCJ2aXNpYmlsaXR5IiwiIil9ZnVuY3Rpb24gZChkKXtkLmdldEF0dHIoImZpeGVkX2hlaWdodCIpfHwoZC5kb20uJHZpZXdwb3J0LmRlbGVnYXRlKCJpbWciLCJsb2FkIixmdW5jdGlvbigpe2soZCl9KSxkLm9uQ2hhbmdlKCJsb2FkaW5nIixmdW5jdGlvbihiKXtifHxrKGQpfSksZC5vbkNoYW5nZSgicGFnZU51bWJlciIsZnVuY3Rpb24oKXtkLmdldEF0dHIoImhpZGVfb2ZmX3NjcmVlbiIpJiZkLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuY3NzKCJ2aXNpYmlsaXR5IiwiIil9KSwKZC5vbkNoYW5nZSgiYW5pbWF0aW5nIixmdW5jdGlvbihiKXshYiYmZC5nZXRBdHRyKCJoaWRlX29mZl9zY3JlZW4iKSYmZihkKX0pLGQub25DaGFuZ2UoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixmdW5jdGlvbigpe2goZCl9KSl9ZnVuY3Rpb24gaChkKXt2YXIgYj1kLmdldERpbWVuc2lvbnMoKSxjPWIudmlld3BvcnQud2lkdGgsYT1kLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiksZT1kLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIiksaD1kLmdldEF0dHIoInNldF9zaXplIikscD1kLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksYz1jLTIqZTthJiYoYy09ZStiLnZpZXdwb3J0LndpZHRoLzMpO3AuY3NzKHt3aWR0aDpjKyJweCIsbWFyZ2luOiIwICIrZSsicHgifSk7Yj1jKzIqZTthPWIqaDtkLmRvbS4kY2Fyb3VzZWwud2lkdGgoYSk7Zm9yKGE9e2Nhcm91c2VsOnt3aWR0aDphfSxpdGVtczpbXX07aC0tOylhLml0ZW1zW2hdPXt3aWR0aDpjLG91dGVyV2lkdGg6Yn07CmQudXBkYXRlRGltZW5zaW9uc0NhY2hlKGEpO2QuZ2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIikmJmYoZCwhMCk7ZC5nb3RvSW5kZXgoZC5nZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIikse2FuaW1hdGlvbkR1cmF0aW9uOjAsaWdub3JlUGF1c2U6ITB9KTtkLnRyaWdnZXJFdmVudCgicmVwYWludCIpfXJldHVybntyZXBhaW50OmgsaW5pdDpmdW5jdGlvbihmKXt2YXIgYj1mLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIik7Zi5zZXRBdHRyKCJtaW5pbXVtX2d1dHRlcl93aWR0aCIsZS5pc0Zpbml0ZU51bWJlcihiKT9iOjE0KTtmLnNldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiwhIWYuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSk7Zi5zZXRBdHRyKCJwYWdlU2l6ZSIsMSk7Zi5zZXRBdHRyKCJwYWdlU2l6ZSIsMSk7Yj1mLmdldEF0dHIoImZpeGVkX2hlaWdodCIpO2UuaXNGaW5pdGVOdW1iZXIoYik/Zi5kb20uJHZpZXdwb3J0LmhlaWdodChiKTpmLnNldEF0dHIoImZpeGVkX2hlaWdodCIsCiExKTtmLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpO2QoZik7dGhpcy5yZXBhaW50KGYpO2soZil9LHJlc2l6ZTpmdW5jdGlvbihkLGIpe2Iudmlld3BvcnQmJnZvaWQgMCE9PWIudmlld3BvcnQud2lkdGgmJih0aGlzLnJlcGFpbnQoZCksZC5nZXRBdHRyKCJmaXhlZF9oZWlnaHQiKXx8ayhkKSl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWRpc3BsYXktcGVla2NpcmN1bGFyIixmdW5jdGlvbihlLGcsayl7ZnVuY3Rpb24gZihkKXtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIGUuaXNGaW5pdGVOdW1iZXIoZik/ZjpkfX1nPXt9O2dbay5QQUdFX1NJWkVdPTE7Z1trLk1JTl9HVVRURVJdPWYoMTQpO2dbay5QRUVLX1BFUkNFTlRBR0VdPWYoMTApO3JldHVybntpbml0QXR0cnM6Zyxpbml0OmZ1bmN0aW9uKGQpe3ZhciBlPXRoaXM7CmQub25DaGFuZ2Uoay5QRUVLX1BFUkNFTlRBR0UsZnVuY3Rpb24oZixiKXtlLnJlcGFpbnQoZCl9KTtkLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpO2UucmVwYWludChkKX0scmVwYWludDpmdW5jdGlvbihkKXt2YXIgZj1kLmdldEF0dHIoay5NSU5fR1VUVEVSKSxnPWQuZ2V0QXR0cihrLlNFVF9TSVpFKSxiPWQuZ2V0QXR0cihrLlBFRUtfUEVSQ0VOVEFHRSksYz1kLmdldERpbWVuc2lvbnMoKS52aWV3cG9ydC53aWR0aCxhPWQuZG9tLiRjYXJvdXNlbCxxPWEuY2hpbGRyZW4oImxpIiksYj1iLzEwMCpjLHU9Yy0yKmItZixwPXUrMipmLGM9cCpnO2Eud2lkdGgoYyk7cS5jc3Moe3dpZHRoOnUrInB4IiwibWFyZ2luLWxlZnQiOmYrInB4IiwibWFyZ2luLXJpZ2h0IjpmKyJweCJ9KTtkLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7Y2Fyb3VzZWw6e3dpZHRoOmN9LGl0ZW1zOmUubWFwKGUucmFuZ2UoZyksZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dSwKb3V0ZXJXaWR0aDpwfX0pfSk7ZC5zZXRBdHRyKGsuUEVFS19XSURUSCxiLCExKTtkLnRyaWdnZXJFdmVudCgicmVwYWludCIpfSxyZXNpemU6ZnVuY3Rpb24oZCxlKXtlLnZpZXdwb3J0JiZ2b2lkIDAhPT1lLnZpZXdwb3J0LndpZHRoJiZ0aGlzLnJlcGFpbnQoZCl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1kaXNwbGF5LXZhcmlhYmxld2lkdGgiLGZ1bmN0aW9uKGUpe3JldHVybntpbml0OmUuY29uc3RhbnRzLk5PT1AscmVzaXplOmUuY29uc3RhbnRzLk5PT1AscmVwYWludDplLmNvbnN0YW50cy5OT09QfX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oImEtY2Fyb3VzZWwtc3RyZXRjaHlnb29kbmVzcyIsImEtY2Fyb3VzZWwtZGlzcGxheS1zd2FwIiwiYS1jYXJvdXNlbC1kaXNwbGF5LXNpbmdsZSIsImEtY2Fyb3VzZWwtZGlzcGxheS1wZWVrY2lyY3VsYXIiLCJhLWNhcm91c2VsLWRpc3BsYXktdmFyaWFibGV3aWR0aCIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtZGlzcGxheSIsCmZ1bmN0aW9uKGUsZyxrLGYsZCl7cmV0dXJue3N3YXA6ZyxzaW5nbGU6ayxwZWVrQ2lyY3VsYXI6ZixzdHJldGNoeUdvb2RuZXNzOmUsdmFyaWFibGVXaWR0aDpkLCJkZWZhdWx0Ijoic3RyZXRjaHlHb29kbmVzcyJ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsImEtY2Fyb3VzZWwtdXRpbHMiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXN3YXAiLGZ1bmN0aW9uKGUsZyxrKXtmdW5jdGlvbiBmKGIsYyl7dmFyIGE9Yi5nZXRBdHRyKCJwcmVsb2FkZWRJbWFnZXMiKTthfHwoYT1bXSk7Zm9yKHZhciBkPVtdLGY9Yy5sZW5ndGgtMTswPD1mO2YtLSlpZihjW2ZdJiYhYVtmXSl7dmFyIGg9ay5nZXRFbGVtZW50RnJvbUl0ZW0oY1tmXSk7aCYmZygiaW1nIixoKS5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKHRoaXMuc3JjKX0pO2FbZl09ITB9ZS5wcmVsb2FkKGQpO2Iuc2V0QXR0cigicHJlbG9hZGVkSW1hZ2VzIixhKX1mdW5jdGlvbiBkKGIpe3JldHVybiJudW1iZXIiPT09CnR5cGVvZiBiP2I/MD5iPy0xOjE6aXNOYU4oYik/TmFOOjA6TmFOfWZ1bmN0aW9uIGgoYixjKXtiLmdldEF0dHIoInBhZ2VOdW1iZXIiKTtiLmdldEF0dHIoInBhZ2VTaXplIik7dmFyIGE9Yi5nZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIiksZD1iLmdldEF0dHIoImRlbGF5X3RpbWUiKSxmPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKSxoPWYuZmlsdGVyKCIuYS1jYXJvdXNlbC1jYXJkLWVtcHR5Iik7aC5sZW5ndGgmJmIuc2V0QXR0cigibG9hZGluZyIsITApO2guZWFjaChmdW5jdGlvbihtLGwpe3ZhciB2PWcobCk7bD1mLmluZGV4KGwpK2EtMTt2YXIgcj1jW2xdO3ImJmUuZGVsYXkoZnVuY3Rpb24oKXtrLmFkZEVsZW1lbnRUb0RvbSh2LGsuZ2V0RWxlbWVudEZyb21JdGVtKHIpKTttPT09aC5sZW5ndGgtMSYmYi5zZXRBdHRyKCJsb2FkaW5nIiwhMSl9LDArZCl9KX1mdW5jdGlvbiBsKGIsYyxhKXthPWF8fHt9O3ZhciBmPWIuZ2V0QXR0cigicGFnZU51bWJlciIpO2lmKGMhPT0KZil7dmFyIGg9Yi5nZXRBdHRyKCJzZXRfc2l6ZSIpLHA9Yi5nZXRBdHRyKCJ0b3RhbFBhZ2VzIiksbT1iLmdldEF0dHIoImNpcmN1bGFyIiksZz1iLmdldEF0dHIoInBhZ2VTaXplIiksbD1hLmRlbGF5VGltZXx8Yi5nZXRBdHRyKCJkZWxheV90aW1lIikscj1kKGEuZGlyZWN0aW9uKXx8TmFOOyFtJiYxPmM/Yz0xOiFtJiZjPnA/Yz1wOm0mJjE+Yz9jPXA6bSYmYz5wJiYoYz0xKTtyfHwocj1mPGM/MTotMSk7YS5zdGFydG92ZXImJihyPWw9MSk7dmFyIHQ9ZyooYy0xKSx4PTE9PT1yPzA6Zy0xO2Iuc2V0QXR0cigicGFnZU51bWJlciIsYyk7Yi5zZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIix0KzEpO2Iuc2V0QXR0cigiYW5pbWF0aW5nIiwhMCk7dmFyIHc9ZS5pbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXQreDtpZih3IT09Yi5nZXRBdHRyKCJyZXNwb25zaXZlVGltZXJJZCIpKWNsZWFySW50ZXJ2YWwodyk7ZWxzZSBpZigtMT09PXImJjA+eHx8MT09PXImJng+PWcpYi5zZXRBdHRyKCJyZXNwb25zaXZlVGltZXJJZCIsCnZvaWQgMCksYi5zZXRBdHRyKCJhbmltYXRpbmciLCExKTtlbHNle3ZhciBjPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5lcSh4KSxkPWIuZ2V0QXR0cigiZmV0Y2hlZEl0ZW1zIilbYV07ZD9rLmFkZEVsZW1lbnRUb0RvbShjLGsuZ2V0RWxlbWVudEZyb21JdGVtKGQpKTphPGg/Yy5odG1sKGIuZ2V0U3RhdGljTG9hZGVyKCkpLmFkZENsYXNzKCJhLWNhcm91c2VsLWNhcmQtZW1wdHkiKTpjLmVtcHR5KCkucmVtb3ZlQ2xhc3MoImEtY2Fyb3VzZWwtY2FyZC1lbXB0eSIpO3grPXJ9fSxsKTtiLnNldEF0dHIoInJlc3BvbnNpdmVUaW1lcklkIix3KX19cmV0dXJue2luaXQ6ZnVuY3Rpb24oYil7dmFyIGM9Yi5nZXRBdHRyKCJkZWxheV90aW1lIik7ZS5pc0Zpbml0ZU51bWJlcihjKXx8Yi5zZXRBdHRyKCJkZWxheV90aW1lIiwzMCk7Yi5vbkNoYW5nZSgicmVzcG9uc2l2ZVRpbWVySWQiLGZ1bmN0aW9uKGEsYyl7YyE9PWEmJmNsZWFySW50ZXJ2YWwoYyl9KTtiLm9uQ2hhbmdlKCJmZXRjaGVkSXRlbXMiLApmdW5jdGlvbihhLGMpe2goYixhKTtmKGIsYSl9KTtmKGIsYi5nZXRBdHRyKCJmZXRjaGVkSXRlbXMiKSl9LGdvdG9JbmRleDpmdW5jdGlvbihiLGMsYSl7YT1hfHx7fTt2YXIgZD1iLmdldEF0dHIoInBhZ2VTaXplIik7bChiLE1hdGguY2VpbChjL2QpLGEpfSxnb3RvTmV4dFBhZ2U6ZnVuY3Rpb24oYixjKXtjPWN8fHt9O3ZhciBhPWIuZ2V0QXR0cigicGFnZU51bWJlciIpO2MuZGlyZWN0aW9uPS0xO2woYiwrK2EsYyl9LGdvdG9QcmV2UGFnZTpmdW5jdGlvbihiLGMpe2M9Y3x8e307dmFyIGE9Yi5nZXRBdHRyKCJwYWdlTnVtYmVyIik7Yy5kaXJlY3Rpb249MTtsKGIsLS1hLGMpfSxnb3RvUGFnZTpsfX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLXV0aWxzIiwiYS1jYXJvdXNlbC1jb25zdGFudHMiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXNsaWRlIixmdW5jdGlvbihlLGcsayxmKXtmdW5jdGlvbiBkKGIpe3ZhciBjPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5sZW5ndGgsCmE9YysxLGQ9Yi5nZXRBdHRyKGYuU0VUX1NJWkUpLGU9ZC1jO2lmKDA8ZSl7Zm9yKHZhciBlPWErZS0xLGg9W107YTw9ZTthKyspaC5wdXNoKGIuZ2V0RW1wdHlDYXJkKGEsZCkpO2IuZG9tLiRjYXJvdXNlbC5hcHBlbmQoaC5qb2luKCIiKSk7Yi5zZXRBdHRyKGYuTE9BRElORywhMCk7Zm9yKHZhciBlPWIuZ2V0QXR0cihmLkZFVENIRURfSVRFTVMpLGg9Yi5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLGcsYT1jO2E8ZDthKyspaWYoZz1lW2FdKXt2YXIgbD1rLmdldEVsZW1lbnRGcm9tSXRlbShnKSxjPWguZXEoYSk7ay5hZGRFbGVtZW50VG9Eb20oYyxsKTtlW2FdPWsuY2xlYXJFbGVtZW50RnJvbUl0ZW0oZyl9Yi5zdHJhdGVnaWVzLmRpc3BsYXkucmVwYWludCYmYi5zdHJhdGVnaWVzLmRpc3BsYXkucmVwYWludChiKTtiLnNldEF0dHIoZi5GRVRDSEVEX0lURU1TLGUsITApO2Iuc2V0QXR0cihmLkxPQURJTkcsITEpfX1mdW5jdGlvbiBoKGIsYyxhKXtpZihiLmdldEF0dHIoZi5BTklNQVRJTkcpKWIub25jZShmLkFOSU1BVElORywKZnVuY3Rpb24oKXtoKGIsYyxhKX0pO2Vsc2V7dmFyIGQ9Yi5nZXREaW1lbnNpb25zKCkuaXRlbXM7aWYoIWF8fGMubGVuZ3RoPj1hLmxlbmd0aCl7Yi5zZXRBdHRyKGYuTE9BRElORywhMCk7Zm9yKHZhciBnPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKSxwPWMubGVuZ3RoLG0sbDtwLS07KWlmKChsPWNbcF0pJiYhZS5lcXVhbHMobCxhW3BdKSYmITAhPT1sJiYhMCE9PWwuY29udGVudCl7dmFyIHY9ay5nZXRFbGVtZW50RnJvbUl0ZW0obCk7bT1nLmVxKHApO20ubGVuZ3RoJiYoay5hZGRFbGVtZW50VG9Eb20obSx2KSxkW3BdPXt3aWR0aDptLm91dGVyV2lkdGgoKSxvdXRlcldpZHRoOm0ub3V0ZXJXaWR0aCghMCksaGVpZ2h0Om0ub3V0ZXJIZWlnaHQoKSxvdXRlckhlaWdodDptLm91dGVySGVpZ2h0KCEwKX0sY1twXT1rLmNsZWFyRWxlbWVudEZyb21JdGVtKGwpKX19Yi5zZXRBdHRyKGYuRkVUQ0hFRF9JVEVNUyxjKTtiLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7aXRlbXM6ZH0pOwpiLnNldEF0dHIoZi5MT0FESU5HLCExKX19dmFyIGw9ZS5jYXBhYmlsaXRpZXMudG91Y2g/MkUzOjNFMztyZXR1cm57d3JhcFRvRmlyc3Q6ZnVuY3Rpb24oYil7dmFyIGM9Yi5nZXRBdHRyKGYuUEFHRV9TSVpFKSxhPWIuZ2V0RGltZW5zaW9ucygpLmdldEZpcnN0Q2FyZFdpZHRoKCksZD10aGlzO2IuZ290b1BpeGVsKGMqYSotMSx7YW5pbWF0aW9uRHVyYXRpb246MCxjYWxsYmFjazpmdW5jdGlvbigpe2Iuc2V0QXR0cihmLkNVUlJFTlRMWV9XUkFQUElORywhMSk7ZC5nb3RvUGFnZShiLDEpfX0pfSx3cmFwVG9MYXN0OmZ1bmN0aW9uKGIpe2IuZ2V0QXR0cihmLlBBR0VfU0laRSk7dmFyIGM9Yi5nZXRBdHRyKGYuVE9UQUxfUEFHRVMpLGE9dGhpcyxkPWIuZ2V0RGltZW5zaW9ucygpLmNhcm91c2VsLndpZHRoO2IuZ290b1BpeGVsKGQse2FuaW1hdGlvbkR1cmF0aW9uOjAsY2FsbGJhY2s6ZnVuY3Rpb24oKXtiLnNldEF0dHIoZi5DVVJSRU5UTFlfV1JBUFBJTkcsITEpO2EuZ290b1BhZ2UoYiwKYyl9fSl9LGdvdG9QYWdlOmZ1bmN0aW9uKGIsYyxhKXthPWF8fHt9Oyh2b2lkIDA9PT1hLmFuaW1hdGlvbkR1cmF0aW9ufHwwPGEuYW5pbWF0aW9uRHVyYXRpb24pJiYhYS5zaWxlbnQmJmIuc2V0QXR0cihmLkFOSU1BVElORywhMCk7dmFyIGQ9Yi5nZXRBdHRyKGYuVE9UQUxfUEFHRVMpOzA8YyYmYzw9ZCYmYi5zZXRBdHRyKGYuUEFHRV9OVU1CRVIsYyk7dmFyIGU9Yi5nZXRBdHRyKGYuQ0lSQ1VMQVIpOyFlJiYxPmM/KGM9MSxhLmFuaW1hdGlvbkR1cmF0aW9uPU1hdGgucG93KGIuZ2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCkqYi5nZXRBdHRyKGYuU1BSSU5HSU5FU1MpKSk6IWUmJmM+ZCYmKGM9ZCxhLmFuaW1hdGlvbkR1cmF0aW9uPU1hdGgucG93KGIuZ2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCksYi5nZXRBdHRyKGYuU1BSSU5HSU5FU1MpKSk7dGhpcy5nb3RvSW5kZXgoYixiLmdldEF0dHIoZi5QQUdFX1NJWkUpKihjLTEpKzEsYSl9LGdvdG9JbmRleDpmdW5jdGlvbihiLGMsCmEpe2E9YXx8e307KHZvaWQgMD09PWEuYW5pbWF0aW9uRHVyYXRpb258fDA8YS5hbmltYXRpb25EdXJhdGlvbikmJiFhLnNpbGVudCYmYi5zZXRBdHRyKGYuQU5JTUFUSU5HLCEwKTt2YXIgZD1iLmdldEF0dHIoZi5DSVJDVUxBUikmJiFiLmdldEF0dHIoZi5DVVJSRU5UTFlfV1JBUFBJTkcpLGg9YS5jYWxsYmFjayxnPXRoaXMsbD0hMSxrPWIuZ2V0Vmlld3BvcnRXaWR0aCgpLHY9TWF0aC5jZWlsKGMvYi5nZXRBdHRyKGYuUEFHRV9TSVpFKSkscjt2IT09Yi5nZXRBdHRyKGYuUEFHRV9OVU1CRVIpJiYwPHYmJnY8PWIuZ2V0QXR0cihmLlRPVEFMX1BBR0VTKSYmYi5zZXRBdHRyKGYuUEFHRV9OVU1CRVIsdik7Yi5zZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNLGMpOzE+Yz9kJiYobD0tMSprLHI9ZnVuY3Rpb24oKXtoJiZoKCk7Zy53cmFwVG9MYXN0KGIpfSk6Yz5iLmdldEF0dHIoZi5TRVRfU0laRSk/ZCYmKGw9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCkrayxyPWZ1bmN0aW9uKCl7aCYmCmgoKTtnLndyYXBUb0ZpcnN0KGIpfSk6bD1iLmdldEl0ZW1PZmZzZXQoYyk7cj8oYi5zZXRBdHRyKGYuQ1VSUkVOVExZX1dSQVBQSU5HLCEwKSxhLmNhbGxiYWNrPXIsYS5lYXNpbmdGdW5jdGlvbj1hLmVhc2luZ0Z1bmN0aW9ufHxiLmdldEF0dHIoZi5XUkFQX0VBU0lORyksYS5hbmltYXRpb25TcGVlZD0xLjMqKGUuaXNGaW5pdGVOdW1iZXIoYS5hbmltYXRpb25TcGVlZCk/YS5hbmltYXRpb25TcGVlZDpiLmdldEF0dHIoZi5BTklNQVRJT05fU1BFRUQpKSk6YS5jYWxsYmFjaz1oOyExIT09bCYmdGhpcy5nb3RvUGl4ZWwoYixsLGEpfSxnb3RvUGl4ZWw6ZnVuY3Rpb24oYixjLGEpe3ZhciBkPWIuZ2V0QXR0cihmLkNVUlJFTlRfUElYRUwpO2lmKGMhPT1kKXthPWF8fHt9O3ZhciBoPWEuZWFzaW5nRnVuY3Rpb258fCJlYXNlLW91dCIsZz1hLmNhbGxiYWNrO2IuZ2V0Vmlld3BvcnRXaWR0aCgpO3ZhciBsO3ZvaWQgMCE9PWEuYW5pbWF0aW9uRHVyYXRpb24/bD1hLmFuaW1hdGlvbkR1cmF0aW9uOgoobD1lLmlzRmluaXRlTnVtYmVyKGEuYW5pbWF0aW9uU3BlZWQpP2EuYW5pbWF0aW9uU3BlZWQ6Yi5nZXRBdHRyKGYuQU5JTUFUSU9OX1NQRUVEKSxkPU1hdGguYWJzKGMtZCksbD0wPT09bD8wOk1hdGguZmxvb3IoZC9sKjFFMykpOzA8bCYmIWEuc2lsZW50JiZiLnNldEF0dHIoZi5BTklNQVRJTkcsITApO2UuaXNGaW5pdGVOdW1iZXIoYyk/KGQ9MDxsP2Z1bmN0aW9uKCl7ZyYmZygpO2IuZ2V0QXR0cihmLkNVUlJFTlRMWV9XUkFQUElORyl8fGIuc2V0QXR0cihmLkFOSU1BVElORyxlLmlzQW5pbWF0ZWQoYi5kb20uJGNhcm91c2VsKSxhLnNpbGVudCl9OmcsYi5zZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCxjKSxlLmFuaW1hdGUoYi5kb20uJGNhcm91c2VsLHtsZWZ0Oi0xKmN9LGwsaCxkKSk6bi5lcnJvcigiVGFyZ2V0IHBpeGVsIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIiLCJhLWNhcm91c2VsLXRyYW5zaXRpb24tc2xpZGUiLCJnb3RvUGl4ZWwiKX19LGdvdG9OZXh0UGFnZTpmdW5jdGlvbihiLApjKXt2YXIgYT1iLmdldEF0dHIoZi5QQUdFX05VTUJFUik7dGhpcy5nb3RvUGFnZShiLCsrYSxjKX0sZ290b1ByZXZQYWdlOmZ1bmN0aW9uKGIsYyl7dmFyIGE9Yi5nZXRBdHRyKGYuUEFHRV9OVU1CRVIpO3RoaXMuZ290b1BhZ2UoYiwtLWEsYyl9LG9uU3dpcGU6ZnVuY3Rpb24oYixjKXtpZighYi5nZXRBdHRyKGYuQ1VSUkVOVExZX1dSQVBQSU5HKSl7dmFyIGE9Yi5nZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNKSxkPWIuZ2V0QXR0cihmLlBBR0VfU0laRSksaD1iLmdldEF0dHIoZi5QQUdFX05VTUJFUiksZz0wPmMudmVsb2NpdHlYLGw9YTtnJiZoPGIuZ2V0QXR0cihmLlRPVEFMX1BBR0VTKT9sPWErZDohZyYmMTxoJiYobD1hLWQpO2Q9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCk7aD1iLmdldEl0ZW1PZmZzZXQobCk7Yz1NYXRoLmFicygxRTMqKGc/ZC1oOmQraCkvYy52ZWxvY2l0eVgpO2M9TWF0aC5tYXgoYywzMDApO2M9TWF0aC5taW4oYywxLjIqZS52aWV3cG9ydCgpLndpZHRoKTsKYz17YW5pbWF0aW9uRHVyYXRpb246YyxlYXNpbmdGdW5jdGlvbjpiLmdldEF0dHIoZi5UT1VDSF9FQVNJTkcpfTtsIT09YXx8Yi5nZXRBdHRyKCJjaXJjdWxhciIpP2c/Yi5nb3RvTmV4dFBhZ2UoYyk6Yi5nb3RvUHJldlBhZ2UoYyk6KGMuYW5pbWF0aW9uU3BlZWQ9Ljk1KmUudmlld3BvcnQoKS53aWR0aCxkZWxldGUgYy5hbmltYXRpb25EdXJhdGlvbixiLmdvdG9JbmRleChsLGMpKX19LG9uUGFuOmZ1bmN0aW9uKGIsYyl7aWYoIWIuZ2V0QXR0cihmLkNVUlJFTlRMWV9XUkFQUElORykpe2Iuc2V0QXR0cihmLkFOSU1BVElORywhMCk7dmFyIGE9Yi5nZXRJdGVtT2Zmc2V0KGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLGQ9YS1jLnRvdWNoRGVsdGFYLGg9Yi5nZXRBdHRyKGYuQ0lSQ1VMQVIpLGc9Yi5nZXRBdHRyKGYuUEFHRV9OVU1CRVIpLGw9Yi5nZXRBdHRyKGYuVE9UQUxfUEFHRVMpO2MuZW5kZWQ/KGE9e2Vhc2luZ0Z1bmN0aW9uOmIuZ2V0QXR0cihmLlRPVUNIX0VBU0lORyksCmFuaW1hdGlvblNwZWVkOi45NSplLnZpZXdwb3J0KCkud2lkdGgsc2lsZW50OiEwfSxjPWMudG91Y2hEZWx0YVgsZD1NYXRoLmFicyhjKTwuNCpiLmdldFZpZXdwb3J0V2lkdGgoKSwhaCYmKDA+YyYmbD09PWd8fDA8YyYmMT09PWcpfHxkP2IuZ290b1BhZ2UoZyxhKTowPmM/Yi5nb3RvTmV4dFBhZ2UoYSk6Yi5nb3RvUHJldlBhZ2UoYSkpOighaCYmKGg9Yi5nZXRBdHRyKGYuU1BSSU5HSU5FU1MpLDA+ZCYmMDxjLnRvdWNoRGVsdGFYfHxnPT09bCYmMD5jLnRvdWNoRGVsdGFYKSYmKGc9TWF0aC5wb3coTWF0aC5hYnMoYy50b3VjaERlbHRhWCksaCksZD0wPj1kPy0xKmc6YStnKSxiLmdvdG9QaXhlbChkLHtlYXNpbmdGdW5jdGlvbjpiLmdldEF0dHIoZi5UT1VDSF9FQVNJTkcpLGFuaW1hdGlvbkR1cmF0aW9uOjAsc2lsZW50OiEwfSkpfX0saW5pdDpmdW5jdGlvbihiKXt2YXIgYz1iLmdldEF0dHIoZi5BTklNQVRJT05fU1BFRUQpO2UuaXNGaW5pdGVOdW1iZXIoYyl8fGIuc2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCwKbCk7dm9pZCAwPT09Yi5nZXRBdHRyKGYuV1JBUF9FQVNJTkcpJiZiLnNldEF0dHIoZi5XUkFQX0VBU0lORywibGluZWFyIik7ZChiKTtiLm9uQ2hhbmdlKGYuRkVUQ0hFRF9JVEVNUyxmdW5jdGlvbihhLGMpe2goYixhLGMpfSk7Yi5vbkNoYW5nZShmLlNFVF9TSVpFLGZ1bmN0aW9uKGEsYyl7YT5jJiZkKGIpfSl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJhLWNhcm91c2VsLXV0aWxzIiwiYS1jYXJvdXNlbC1jaXJjdWxhci11dGlscyIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtdHJhbnNpdGlvbi1zbGlkZWNpcmN1bGFyIixmdW5jdGlvbihlLGcsayxmKXtmdW5jdGlvbiBkKGEpe3ZhciBjPWEuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5sZW5ndGgsZD1hLmdldEF0dHIoZi5TRVRfU0laRSksaD1kLWMsZz1iKGEsYyk7MDxoJiYoYys9MSxoPWUubWFwKGUucmFuZ2UoYyxjK2gpLGZ1bmN0aW9uKGMpe3JldHVybiBhLmdldEVtcHR5Q2FyZChjLApkKX0pLGcuYWZ0ZXIoaC5qb2luKCIiKSksYS5tZWFzdXJlKCJpdGVtcyIpKX1mdW5jdGlvbiBoKGIsZCl7dmFyIGU9Yi5nZXRBdHRyKGYuU0VUX1NJWkUpO2lmKDI8Yi5nZXRBdHRyKGYuU0VUX1NJWkUpKXt2YXIgaD1hKGIsYi5nZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNKSksZz1NYXRoLnJvdW5kKGIuZ2V0QXR0cihmLlNFVF9TSVpFKS8yKSxlPWwoZyxoLGUpOzAhPT1lLnF1YW50aXR5JiYobShiLGUuZGlyZWN0aW9uLGUucXVhbnRpdHkpLGg9ZS5kaXJlY3Rpb249PT12LkNMT0NLV0lTRT9oLWUucXVhbnRpdHk6aCtlLnF1YW50aXR5LGQuZ290b1BpeGVsKGIsYyhiLGgpLHthbmltYXRpb25EdXJhdGlvbjowfSkpfX1mdW5jdGlvbiBsKGEsYyxiKXt2YXIgZD17fTthPT09Yz9hPWM9MDphPmM/KGM9YS1jLGE9Yi1jKTooYT1jLWEsYz1iLWEpO2QuZGlyZWN0aW9uPWE8PWM/di5DTE9DS1dJU0U6di5DT1VOVEVSX0NMT0NLV0lTRTtkLnF1YW50aXR5PU1hdGgubWluKGEsYyk7cmV0dXJuIGR9CmZ1bmN0aW9uIGIoYyxiKXtyZXR1cm4gYy5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLmVxKGEoYyxiKS0xKX1mdW5jdGlvbiBjKGEsYyl7dmFyIGI9TWF0aC5mbG9vcihhLmdldEF0dHIoZi5QRUVLX1dJRFRIKXx8MCk7cmV0dXJuIGEuZ2V0SXRlbU9mZnNldChjKS1ifWZ1bmN0aW9uIGEoYSxjKXtjPWN8fDE7dmFyIGI9YS5nZXRBdHRyKCJ0cmFuc2l0aW9uU2xpZGVDaXJjdWxhckZpcnN0Q2FyZEluZGV4Iik7YT1hLmdldEF0dHIoZi5TRVRfU0laRSk7cmV0dXJuIGsucmVsYXRpdmVJbmRleEZyb21JbmRleChjLGIsYSl9ZnVuY3Rpb24gcShjLGQsaCl7aWYoYy5nZXRBdHRyKGYuQU5JTUFUSU5HKSljLm9uY2UoZi5BTklNQVRJTkcsZnVuY3Rpb24oKXtxKGMsZCxoKX0pO2Vsc2V7dmFyIGw9Yy5nZXREaW1lbnNpb25zKCkuaXRlbXMsaz1NYXRoLm1pbihkLmxlbmd0aCxjLmdldEF0dHIoZi5TRVRfU0laRSkpO2lmKCFofHxkLmxlbmd0aD49aC5sZW5ndGgpYy5zZXRBdHRyKGYuTE9BRElORywKITApLGUuZWFjaChlLnJhbmdlKGspLGZ1bmN0aW9uKGYpe3ZhciBrPWYrMSxwPWRbZl0sbT1iKGMsaykscT1wJiYhKCEwPT09cHx8ITA9PT1wLmNvbnRlbnQpO3AmJiFlLmVxdWFscyhwLGhbZl0pJiZtLmxlbmd0aCYmcSYmKGs9YShjLGspLGxba109e3dpZHRoOm0ub3V0ZXJXaWR0aCgpLG91dGVyV2lkdGg6bS5vdXRlcldpZHRoKCEwKSxoZWlnaHQ6bS5vdXRlckhlaWdodCgpLG91dGVySGVpZ2h0Om0ub3V0ZXJIZWlnaHQoITApfSxnLmFkZEVsZW1lbnRUb0RvbShtLGcuZ2V0RWxlbWVudEZyb21JdGVtKHApKSxkW2ZdPWcuY2xlYXJFbGVtZW50RnJvbUl0ZW0ocCkpfSksYy5zZXRBdHRyKGYuTE9BRElORywhMSk7Yy5zZXRBdHRyKGYuRkVUQ0hFRF9JVEVNUyxkKTtjLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7aXRlbXM6bH0pfX1mdW5jdGlvbiB1KGEpe3ZhciBjPXtyZWFjaGVkOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCEoMjxhLmdldEF0dHIoZi5TRVRfU0laRSkpKXt2YXIgYj1hLmdldEF0dHIoZi5QQUdFX05VTUJFUik7CmE9YS5nZXRBdHRyKGYuU0VUX1NJWkUpOzE9PT1iJiYoYy5yZWFjaGVkPSEwLGMubGVmdD0hMCk7Yj09PWEmJihjLnJlYWNoZWQ9ITAsYy5yaWdodD0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gcChhLGMsYil7dmFyIGQ9dShhKSxlPWEuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKTtkLnJlYWNoZWQmJmRbY10/YS5nb3RvUGFnZShlKTooInJpZ2h0Ij09PWM/YS5nb3RvTmV4dFBhZ2U6YS5nb3RvUHJldlBhZ2UpLmNhbGwoYSxiKX1mdW5jdGlvbiBtKGEsYyxiKXt2YXIgZD1hLmdldEF0dHIoInRyYW5zaXRpb25TbGlkZUNpcmN1bGFyRmlyc3RDYXJkSW5kZXgiKXx8MSxlPWEuZ2V0QXR0cihmLlNFVF9TSVpFKSxoPWEuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKSxnPWEuZG9tLiRjYXJvdXNlbDtjPT09di5DTE9DS1dJU0U/KGsucm90YXRlQ1coZyxoLGIpLGQ9ay5maXJzdENhcmRJbmRleEFmdGVyUm90YXRlKGIsZCxlKSk6KGsucm90YXRlQ0NXKGEuZG9tLiRjYXJvdXNlbCxhLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksCmIpLGQ9ay5maXJzdENhcmRJbmRleEFmdGVyUm90YXRlKC0xKmIsZCxlKSk7YS5zZXRBdHRyKCJ0cmFuc2l0aW9uU2xpZGVDaXJjdWxhckZpcnN0Q2FyZEluZGV4IixkKTtiPWJ8fDE7Yz1jfHx2LkNMT0NLV0lTRTtkPWEuZ2V0RGltZW5zaW9ucygpLml0ZW1zO2Q9Yz09PXYuQ0xPQ0tXSVNFP2sucm90YXRlQXJyYXlDVyhkLGIpOmsucm90YXRlQXJyYXlDQ1coZCxiKTthLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7aXRlbXM6ZH0pfWZ1bmN0aW9uIEEoYixkLGcsbCxrKXt2YXIgcD1rLmNhbGxiYWNrLEI9YShiLGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLHE9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCktYyhiLEIpO2Uuc2VxdWVuY2UoZnVuY3Rpb24oYSl7bShiLGQsbCk7YSgpfSxmdW5jdGlvbihhKXtnLmdvdG9QaXhlbChiLGMoYixkPT09di5DTE9DS1dJU0U/Qi1sOkIrbCkrcSx7YW5pbWF0aW9uRHVyYXRpb246MCxjYWxsYmFjazphfSl9LGZ1bmN0aW9uKGEpe2suY2FsbGJhY2s9CmE7Zy5nb3RvUGl4ZWwoYixjKGIsQiksayl9LGZ1bmN0aW9uKGEpe2goYixnKTthKCl9LGZ1bmN0aW9uKGEpe3AmJnAoKTthKCl9KSgpfXZhciB2PXtDTE9DS1dJU0U6MSxDT1VOVEVSX0NMT0NLV0lTRTotMX0scj1lLmNhcGFiaWxpdGllcy50b3VjaD8yRTM6M0UzLHQ9e307dFtmLkhJREVfT0ZGX1NDUkVFTl09ITE7dFtmLkFOSU1BVElPTl9TUEVFRF09ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBlLmlzRmluaXRlTnVtYmVyKGMpP2M6YX19KHIpO3QudHJhbnNpdGlvblNsaWRlQ2lyY3VsYXJGaXJzdENhcmRJbmRleD0xO3JldHVybntpbml0QXR0cnM6dCxpbml0OmZ1bmN0aW9uKGEpe2QoYSk7YS5vbkNoYW5nZShmLkZFVENIRURfSVRFTVMsZnVuY3Rpb24oYyxiKXtxKGEsYyxiKTthLnN0cmF0ZWdpZXMuZGlzcGxheS5yZXBhaW50KGEpfSk7YS5vbkNoYW5nZShmLlNFVF9TSVpFLGZ1bmN0aW9uKGMsYil7Yz5iJiZkKGEpfSk7YS5vbkNoYW5nZShmLlBFRUtfV0lEVEgsCmZ1bmN0aW9uKGMsYil7YyE9PWImJihjPWEuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSksYS5nb3RvSW5kZXgoYykpfSl9LGFmdGVySW5pdDpmdW5jdGlvbihhKXtoKGEsdGhpcyk7YS5zdHJhdGVnaWVzLmRpc3BsYXkucmVwYWludChhKTthLmdvdG9QYWdlKGEuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKSl9LGdvdG9QYWdlOmZ1bmN0aW9uKGEsYyxiKXtiPWJ8fHt9O3ZhciBkPWEuZ2V0QXR0cihmLlRPVEFMX1BBR0VTKTswPGMmJmM8PWQmJihhLnNldEF0dHIoZi5QQUdFX05VTUJFUixjKSx0aGlzLmdvdG9JbmRleChhLGEuZ2V0QXR0cihmLlBBR0VfU0laRSkqKGMtMSkrMSxiKSl9LGdvdG9JbmRleDpmdW5jdGlvbihiLGQsZSl7dmFyIGg9Yi5nZXRBdHRyKGYuU0VUX1NJWkUpLGc9YShiLGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLGs9YShiLGQpO2c9PT1rP3RoaXMuZ290b1BpeGVsKGIsYyhiLGcpLGUpOigyPGIuZ2V0QXR0cihmLlNFVF9TSVpFKT8oaD1sKGcsaywKaCksZS5zdGFydG92ZXImJig1PGgucXVhbnRpdHk/ZS5hbmltYXRpb25EdXJhdGlvbj0xMjUwOihkZWxldGUgZS5hbmltYXRpb25EdXJhdGlvbixlLmFuaW1hdGlvblNwZWVkPTUqYi5nZXREaW1lbnNpb25zKCkudmlld3BvcnQud2lkdGgpKSxBKGIsaC5kaXJlY3Rpb24sdGhpcyxoLnF1YW50aXR5LGUpKTp0aGlzLmdvdG9QaXhlbChiLGMoYixkKSxlKSxiLnNldEF0dHIoZi5GSVJTVF9WSVNJQkxFX0lURU0sZCkpfSxnb3RvUGl4ZWw6ZnVuY3Rpb24oYSxjLGIpe3ZhciBkPWEuZ2V0QXR0cihmLkNVUlJFTlRfUElYRUwpO2lmKGMhPT1kKXtlLmlzRmluaXRlTnVtYmVyKGMpfHxuLmVycm9yKCJUYXJnZXQgcGl4ZWwgaXMgbm90IGEgZmluaXRlIG51bWJlciIsImEtY2Fyb3VzZWwtdHJhbnNpdGlvbi1zbGlkZS1jaXJjdWxhciIsImdvdG9QaXhlbCIpO2I9Ynx8e307dmFyIGg9Yi5lYXNpbmdGdW5jdGlvbnx8ImVhc2Utb3V0IixnPWIuY2FsbGJhY2ssbDt2b2lkIDAhPT1iLmFuaW1hdGlvbkR1cmF0aW9uPwpsPWIuYW5pbWF0aW9uRHVyYXRpb246KGw9ZS5pc0Zpbml0ZU51bWJlcihiLmFuaW1hdGlvblNwZWVkKT9iLmFuaW1hdGlvblNwZWVkOmEuZ2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCksZD1NYXRoLmFicyhjLWQpLGw9MD09PWw/MDpNYXRoLmZsb29yKGQvbCoxRTMpKTswPGwmJighYi5zaWxlbnQmJmEuc2V0QXR0cihmLkFOSU1BVElORywhMCksZz1mdW5jdGlvbigpe2IuY2FsbGJhY2smJmIuY2FsbGJhY2soKTthLnNldEF0dHIoZi5BTklNQVRJTkcsZS5pc0FuaW1hdGVkKGEuZG9tLiRjYXJvdXNlbCksYi5zaWxlbnQpfSk7YS5zZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCxjKTtlLmFuaW1hdGUoYS5kb20uJGNhcm91c2VsLHtsZWZ0Oi0xKmN9LGwsaCxnKX19LGdvdG9OZXh0UGFnZTpmdW5jdGlvbihhLGMpe3ZhciBiPWEuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKSxiPWI9PT1hLmdldEF0dHIoZi5UT1RBTF9QQUdFUyk/MTpiKzE7dGhpcy5nb3RvUGFnZShhLGIsYyl9LGdvdG9QcmV2UGFnZTpmdW5jdGlvbihhLApjKXt2YXIgYj1hLmdldEF0dHIoZi5QQUdFX05VTUJFUiksYj0xPT09Yj9hLmdldEF0dHIoZi5UT1RBTF9QQUdFUyk6Yi0xO3RoaXMuZ290b1BhZ2UoYSxiLGMpfSxvblN3aXBlOmZ1bmN0aW9uKGIsZCl7dmFyIGg9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCksZz1iLmdldEF0dHIoZi5QQUdFX1NJWkUpLGw9YShiLGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLGs9MD5kLnZlbG9jaXR5WCxnPWMoYixrP2wrZzpsLWcpLGg9TWF0aC5hYnMoMUUzKihrP2gtZzpoK2cpL2QudmVsb2NpdHlYKSxrPTEuMiplLnZpZXdwb3J0KCkud2lkdGg7cChiLDA+ZC50b3VjaERlbHRhWD8icmlnaHQiOiJsZWZ0Iix7YW5pbWF0aW9uRHVyYXRpb246TWF0aC5taW4oTWF0aC5tYXgoaCwzMDApLGspLGVhc2luZ0Z1bmN0aW9uOmIuZ2V0QXR0cihmLlRPVUNIX0VBU0lORyl9KX0sb25QYW46ZnVuY3Rpb24oYixkKXtiLnNldEF0dHIoZi5BTklNQVRJTkcsITApO3ZhciBoPWIuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKSwKZz1hKGIsYi5nZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNKSksZz1jKGIsZyksZz11KGIpLnJlYWNoZWQ/Zy0uNCpkLnRvdWNoRGVsdGFYOmctZC50b3VjaERlbHRhWDtkLmVuZGVkPyhnPXtlYXNpbmdGdW5jdGlvbjpiLmdldEF0dHIoZi5UT1VDSF9FQVNJTkcpLGFuaW1hdGlvblNwZWVkOi45NSplLnZpZXdwb3J0KCkud2lkdGgsc2lsZW50OiEwfSxNYXRoLmFicyhkLnRvdWNoRGVsdGFYKT49LjQqYi5nZXRWaWV3cG9ydFdpZHRoKCk/cChiLDA+ZC50b3VjaERlbHRhWD8icmlnaHQiOiJsZWZ0IixnKTpiLmdvdG9QYWdlKGgsZykpOmIuZ290b1BpeGVsKGcse2Vhc2luZ0Z1bmN0aW9uOmIuZ2V0QXR0cihmLlRPVUNIX0VBU0lORyksYW5pbWF0aW9uRHVyYXRpb246MCxzaWxlbnQ6ITB9KX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtdXRpbHMiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXRyYW5zaXRpb24tZnJlZXNjcm9sbCIsCmZ1bmN0aW9uKGUsZyxrKXtmdW5jdGlvbiBmKGMpe2FbYy5fX2lkXXx8KGFbYy5fX2lkXT1uZXcgcShjKSk7cmV0dXJuIGFbYy5fX2lkXX1mdW5jdGlvbiBkKGEpe2Zvcih2YXIgYz1hLmNvdW50SXRlbXMoKSxiPVtdLGQ9MDtkPGM7ZCsrKWIucHVzaCghMCk7YS5zZXRBdHRyKGsuRkVUQ0hFRF9JVEVNUyxiKX1mdW5jdGlvbiBoKGEpe3ZhciBjPWEuY291bnRJdGVtcygpLGI9YS5nZXRBdHRyKGsuU0VUX1NJWkUpLGQ9W10sZTtpZihiPmMpe2Zvcih2YXIgZj0wO2Y8Yi1jO2YrKyllPWMrZisxLGQucHVzaChhLmdldEVtcHR5Q2FyZChlLGIpKTthLmFwcGVuZEl0ZW1zKGQpfX1mdW5jdGlvbiBsKGEsYyxiKXtpZighYnx8Yy5sZW5ndGg+PWIubGVuZ3RoKWZvcih2YXIgZD1hLmdldEl0ZW1zKCksZj1jLmxlbmd0aCxoO2YtLTspKGg9Y1tmXSkmJiFlLmVxdWFscyhoLGJbZl0pJiYhMCE9PWgmJiEwIT09aC5jb250ZW50JiZhLmhhc0l0ZW0oZCxmKSYmKGNbZl09YS5pbnNlcnRGZXRjaGVkSXRlbShoLApkLGYpKTthLnNldEF0dHIoay5GRVRDSEVEX0lURU1TLGMpfWZ1bmN0aW9uIGIoYSl7YS5oYXNFbXB0eUNhcmQoKSYmYS5hdHRhY2hTY3JvbGxMaXN0ZW5lcihmdW5jdGlvbigpe2EudGhyb3R0bGUoImRldGVjdCIsYyl9KX1mdW5jdGlvbiBjKGEpe3ZhciBiPWEuZ2V0QXR0cigibG9hZGluZ190aHJlc2hvbGRfcGl4ZWxzIiksZD1hLm1lYXN1cmVXaWR0aCgpLGU9YS5nZXRGaXJzdEVtcHR5RGV0YWlscygpOy0xIT09ZS5pbmRleCYmZS5sZWZ0PGQrYj9hLndhbnROZXh0KGUuaW5kZXgsYS5nZXRBdHRyKCJuZXh0X3JlcXVlc3Rfc2l6ZSIpKTooYS5wcmV2aW91c0NhcmRMZWZ0JiZhLnByZXZpb3VzQ2FyZExlZnQhPT1lLmxlZnQmJmEudGhyb3R0bGUoImRldGVjdCIsYyksYS5wcmV2aW91c0NhcmRMZWZ0PWUubGVmdCl9dmFyIGE9e30scT1mdW5jdGlvbihhKXt0aGlzLmNhcm91c2VsPWF9O2UuZXh0ZW5kKHEucHJvdG90eXBlLHtzZXRBdHRyOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuY2Fyb3VzZWwuc2V0QXR0cihhLApjKX0sZ2V0QXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jYXJvdXNlbC5nZXRBdHRyKGEpfSxvbkNoYW5nZTpmdW5jdGlvbihhLGMpe3RoaXMuY2Fyb3VzZWwub25DaGFuZ2UoYSxjKX0sZ2V0SXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYXJvdXNlbC5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpfSxjb3VudEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0SXRlbXMoKS5sZW5ndGh9LHNob3dJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEl0ZW1zKCkuY3NzKCJ2aXNpYmlsaXR5IiwiIikuYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpfSxnZXRFbXB0eUNhcmQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5jYXJvdXNlbC5nZXRFbXB0eUNhcmQoYSxjKX0sZ2V0RW1wdHlDYXJkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhcm91c2VsLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oIi5hLWNhcm91c2VsLWNhcmQtZW1wdHkiKX0saGFzRW1wdHlDYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIDA8CnRoaXMuZ2V0RW1wdHlDYXJkcygpLmxlbmd0aH0sZ2V0Rmlyc3RFbXB0eURldGFpbHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEVtcHR5Q2FyZHMoKTtyZXR1cm4gMDxhLmxlbmd0aD8oYT1hLmZpcnN0KCkse2luZGV4OmEuaW5kZXgoKSxsZWZ0OmEucG9zaXRpb24oKS5sZWZ0fSk6e2luZGV4Oi0xLGxlZnQ6LTF9fSxhcHBlbmRJdGVtczpmdW5jdGlvbihhKXt0aGlzLmNhcm91c2VsLmRvbS4kY2Fyb3VzZWwuYXBwZW5kKGEuam9pbigiIikpfSxoYXNJdGVtOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDA8YS5lcShjKS5sZW5ndGh9LGluc2VydEZldGNoZWRJdGVtOmZ1bmN0aW9uKGEsYyxiKXtnLmFkZEVsZW1lbnRUb0RvbShjLmVxKGIpLGcuZ2V0RWxlbWVudEZyb21JdGVtKGEpKTtyZXR1cm4gZy5jbGVhckVsZW1lbnRGcm9tSXRlbShhKX0sYXR0YWNoU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYSl7dGhpcy5jYXJvdXNlbC5kb20uJGNhcm91c2VsLmJpbmQoZS5hY3Rpb24ubW92ZSsiLmEtY2Fyb3VzZWwtZnJlZVNjcm9sbCBzY3JvbGwuYS1jYXJvdXNlbC1mcmVlU2Nyb2xsIiwKYSl9LGRldGFjaFNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKGEpe3RoaXMuY2Fyb3VzZWwuZG9tLiRjYXJvdXNlbC51bmJpbmQoIi5hLWNhcm91c2VsLWZyZWVTY3JvbGwiKX0sbWVhc3VyZVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Fyb3VzZWwuZG9tLiRjYXJvdXNlbC5vdXRlcldpZHRoKCl9LHdhbnROZXh0OmZ1bmN0aW9uKGEsYyl7dGhpcy5jYXJvdXNlbC5zdHJhdGVnaWVzLmFqYXgud2FudCh0aGlzLmNhcm91c2VsLGEsYyl9LHRocm90dGxlOmZ1bmN0aW9uKGEsYyl7dmFyIGI9dGhpcztjbGVhclRpbWVvdXQoYlthXSk7YlthXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhiKX0sMTAwKX19KTt2YXIgdT17YWpheExvY2s6ITB9O3Vbay5OT19UUkFOU0lUSU9OXT0hMDt1W2suSElERV9PRkZfU0NSRUVOXT0hMTt1W2suQVVUT19BREpVU1RfSEVJR0hUXT0hMTt1Lm5leHRfcmVxdWVzdF9zaXplPTEwO3UubG9hZGluZ190aHJlc2hvbGRfcGl4ZWxzPTQwMDtyZXR1cm57Z290b0luZGV4OmUuY29uc3RhbnRzLk5PT1AsCmdvdG9OZXh0cGFnZTplLmNvbnN0YW50cy5OT09QLGdvdG9QcmV2UGFnZTplLmNvbnN0YW50cy5OT09QLGdvdG9QYWdlOmUuY29uc3RhbnRzLk5PT1AsaW5pdEF0dHJzOnUsaW5pdDpmdW5jdGlvbihhKXt2YXIgZz1mKGEpO2cuc2hvd0l0ZW1zKCk7ZChnKTtoKGcpO2IoZyk7Zy5vbkNoYW5nZShrLkZFVENIRURfSVRFTVMsZnVuY3Rpb24oYSxiKXtjKGcpO2woZyxhLGIpO2cuaGFzRW1wdHlDYXJkKCl8fGcuZGV0YWNoU2Nyb2xsTGlzdGVuZXIoKX0pO2Uub24ucmVzaXplKGZ1bmN0aW9uKCl7YyhnKX0pfSxhZnRlckluaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtlLmRlbGF5KGZ1bmN0aW9uKCl7Yi5zZXRBdHRyKCJhamF4TG9jayIsITEpO2MoYil9KX0scHJlcGFyZUZldGNoZWRJdGVtczpkLGFkZEVtcHR5Q2FyZHM6aCxoYW5kbGVJdGVtQ2hhbmdlczpsLGRldGVjdEVtcHR5Q2FyZHNMb2FkaW5nVGhyZXNob2xkOmMsQVRUUjp7TkVYVF9SRVFVRVNUX1NJWkU6Im5leHRfcmVxdWVzdF9zaXplIiwKTE9BRElOR19USFJFU0hPTERfUElYRUxTOiJsb2FkaW5nX3RocmVzaG9sZF9waXhlbHMifX19KTsidXNlIHN0cmljdCI7bi53aGVuKCJBIiwialF1ZXJ5IiwiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXNsaWRlIiwiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXN3YXAiLCJhLWNhcm91c2VsLXRyYW5zaXRpb24tZnJlZXNjcm9sbCIsImEtY2Fyb3VzZWwtdHJhbnNpdGlvbi1zbGlkZWNpcmN1bGFyIiwiYS1jYXJvdXNlbC1jb25zdGFudHMiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1zdHJhdGVnaWVzLXRyYW5zaXRpb24iLGZ1bmN0aW9uKGUsZyxrLGYsZCxoLGwpe2c9e307Z1tsLk5PX1RSQU5TSVRJT05dPSEwO2dbbC5ISURFX09GRl9TQ1JFRU5dPSExO2dbbC5BVVRPX0FESlVTVF9IRUlHSFRdPSExO3JldHVybntzbGlkZUhvcml6b250YWw6ayxzd2FwOmYsZnJlZVNjcm9sbDpkLHNsaWRlQ2lyY3VsYXI6aCxub25lOntnb3RvSW5kZXg6ZS5jb25zdGFudHMuTk9PUCxnb3RvTmV4dFBhZ2U6ZS5jb25zdGFudHMuTk9PUCwKZ290b1ByZXZQYWdlOmUuY29uc3RhbnRzLk5PT1AsZ290b1BhZ2U6ZS5jb25zdGFudHMuTk9PUCxpbml0QXR0cnM6Zyxpbml0OmZ1bmN0aW9uKGIpe2IuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5jc3MoInZpc2liaWxpdHkiLCIiKS5hdHRyKCJhcmlhLWhpZGRlbiIsImZhbHNlIil9fSwiZGVmYXVsdCI6InNsaWRlSG9yaXpvbnRhbCJ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWFqYXgtc3RhbmRhcmQiLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGcoZCxoLGcpe2QudHJpZ2dlckV2ZW50KCJiZWZvcmVBamF4Iix7dXJsOmgscGFyYW1zOmd9KTtlLmdldChoLHtjYWNoZTohMSxzdWNjZXNzOmZ1bmN0aW9uKGIpe2I9ZS5pc0FycmF5KGIpP2I6YiE9PWYmJm51bGwhPT1iJiYhZS5vYmplY3RJc0VtcHR5KGIpJiZiLmhhc093blByb3BlcnR5KCJkYXRhIikmJmUuaXNBcnJheShiLmRhdGEpP2IuZGF0YTpudWxsO2lmKG51bGw9PT1iKW4uZXJyb3IoIkludmFsaWQgSlNPTiByZXR1cm5lZCB0byBjYXJvdXNlbCBmcm9tICIrCmgrIiAtIHNlZSBodHRwOi8vdGlueS9jMW1yNWgwdSBmb3IgZGV0YWlscy4iLCJhLWNhcm91c2VsLWFqYXgtc3RhbmRhcmQiLCJzZW5kUmVxdWVzdCIpO2Vsc2V7Zy5uZWVkU2V0U2l6ZSYmKGImJmIubGVuZ3RofHxuLmVycm9yKCJDYXJvdXNlbCByZXF1aXJlcyBhIHNldF9zaXplIGFuZCBub25lIHdhcyByZXR1cm5lZCBieSB0aGUgZmFsbGJhY2sgQUpBWCByZXF1ZXN0IGF0OiAiK2gsImEtY2Fyb3VzZWwtYWpheC1zdGFuZGFyZCIsInNlbmRSZXF1ZXN0IiksZC5zZXRBdHRyKCJzZXRfc2l6ZSIsYlswXS5zZXRTaXplP2JbMF0uc2V0U2l6ZTpiLmxlbmd0aCkpO2Zvcih2YXIgYz1kLmdldEF0dHIoImZldGNoZWRJdGVtcyIpLGE7KGE9Yi5wb3AoKSkhPT1mOylhJiYoYS5jb250ZW50fHwiIj09PWEuY29udGVudD9hLmNvbnRlbnQ9ZS50cmltKGEuY29udGVudCk6YT1lLnRyaW0oYSkpLGNbZy5vZmZzZXQrYi5sZW5ndGhdPWE7Zy5uZWVkU2V0U2l6ZSYmZC5pbml0KCk7ZC5zZXRBdHRyKCJmZXRjaGVkSXRlbXMiLApjKTtkLnNldEF0dHIoImFqYXhMb2NrIiwhMSk7Zy5uZWVkU2V0U2l6ZSYmZC5nZXRBdHRyKCJwYWdlU2l6ZSIpPj1jLmxlbmd0aCYmZC5zdHJhdGVnaWVzLmFqYXgud2FudEN1cnJlbnRQYWdlKGQpO2QudHJpZ2dlckV2ZW50KCJhamF4U3VjY2VzcyIse3VybDpoLHBhcmFtczpnfSl9fSxwYXJhbXM6Z30pfWZ1bmN0aW9uIGsoZCl7dmFyIGU9ZC5nZXRBdHRyKCJyZXF1ZXN0VGltZXIiKTtlJiYoY2xlYXJUaW1lb3V0KGUpLGQuc2V0QXR0cigicmVxdWVzdFRpbWVyIixudWxsKSl9dmFyIGY7cmV0dXJue2dldEl0ZW1zOmZ1bmN0aW9uKGQsZixsKXt2YXIgYj1kLmdldEF0dHIoImFqYXgiKTtkLnNldEF0dHIoInJlcXVlc3RUaW1lciIsZS5kZWxheShnLGIuZmV0Y2hfZGVsYXksZCxmLGwpKX0sd2FudE5leHRQYWdlOmZ1bmN0aW9uKGQpe2soZCk7aWYoZC5nZXRBdHRyKCJhamF4IikucHJlZmV0Y2hfbmV4dF9wYWdlKXt2YXIgZT1kLmdldEF0dHIoInBhZ2VTaXplIiksZj0yKmU7ZC5nZXRBdHRyKCJzaG93X3BhcnRpYWxfbmV4dCIpJiYKZisrO3RoaXMud2FudChkLChkLmdldEF0dHIoInBhZ2VOdW1iZXIiKS0xKSplLGYpfWVsc2UgdGhpcy53YW50Q3VycmVudFBhZ2UoZCl9LHdhbnRQcmV2UGFnZTpmdW5jdGlvbihkKXtrKGQpO2lmKGQuZ2V0QXR0cigiYWpheCIpLnByZWZldGNoX25leHRfcGFnZSl7dmFyIGU9ZC5nZXRBdHRyKCJwYWdlU2l6ZSIpLGY9MiplO2QuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSYmZisrO3RoaXMud2FudChkLChkLmdldEF0dHIoInBhZ2VOdW1iZXIiKS0yKSplLGYpfWVsc2UgdGhpcy53YW50Q3VycmVudFBhZ2UoZCl9LHdhbnRDdXJyZW50UGFnZTpmdW5jdGlvbihkKXtrKGQpO3ZhciBlPWQuZ2V0QXR0cigicGFnZVNpemUiKSxmPWQuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKT9lKzE6ZTt0aGlzLndhbnQoZCwoZC5nZXRBdHRyKCJwYWdlTnVtYmVyIiktMSkqZSxmKX0sd2FudDpmdW5jdGlvbihkLGUsZil7aWYoIWQuZ2V0QXR0cigiYWpheExvY2siKSl7ayhkKTt2YXIgYj1kLmdldEF0dHIoImFqYXgiKSwKYz1kLmdldEF0dHIoInNldF9zaXplIik7aWYoYi51cmwpe3ZhciBhPWQuZ2V0QXR0cigiZmV0Y2hlZEl0ZW1zIiksZz1iLmlkX2xpc3Q7Z3x8KGc9W10pO3ZhciB1PS0xPGU/ZTowO2U9ZStmLTE7dmFyIHA9Yi5wYXJhbXN8fHt9LG09W10sbj1bXTswPT09YyYmKGcubGVuZ3RoJiYoYz1nKSxwLm5lZWRTZXRTaXplPSJ0cnVlIixkLnNldEF0dHIoImFqYXhMb2NrIiwhMCkpO2ZvcigtMT09PWYmJmMmJihlPWMpO3U8PWUmJnU8YzspYVt1XXx8KChmPWdbdV0pJiZtLnB1c2goZiksbi5wdXNoKHUpLGFbdV09ITEpLHUrKztkLnNldEF0dHIoImZldGNoZWRJdGVtcyIsYSx7c2lsZW50OiEwfSk7cC5jb3VudD1uLmxlbmd0aDtwLm9mZnNldD1uWzBdfHwwOzA8bS5sZW5ndGgmJihwW2IuaWRfcGFyYW1fbmFtZV09bS5qb2luKCIsIikpOygwPG4ubGVuZ3RofHxwLm5lZWRTZXRTaXplKSYmdGhpcy5nZXRJdGVtcyhkLGIudXJsLHApfX19LGluaXQ6ZnVuY3Rpb24oZCl7dmFyIGc9ZC5nZXRBdHRyKCJhamF4Iik7CmUuaXNGaW5pdGVOdW1iZXIoZy5mZXRjaF9kZWxheSl8fChnLmZldGNoX2RlbGF5PTUwMCk7Zy5pZF9wYXJhbV9uYW1lPWcuaWRfcGFyYW1fbmFtZXx8ImlkcyI7Zy5wcmVmZXRjaF9uZXh0X3BhZ2U9Zy5wcmVmZXRjaF9uZXh0X3BhZ2U9PT1mPyEwOiEhZy5wcmVmZXRjaF9uZXh0X3BhZ2U7ZC5zZXRBdHRyKCJhamF4IixnKTtkLmdldEF0dHIoInNldF9zaXplIil8fHRoaXMud2FudChkLDAsLTEpfSxhZnRlckluaXQ6ZnVuY3Rpb24oZCl7ZC5zdHJhdGVnaWVzLmFqYXgud2FudEN1cnJlbnRQYWdlKGQpO2Qub25DaGFuZ2UoInBhZ2VOdW1iZXIiLGZ1bmN0aW9uKGUsZil7ZT5mP2Quc3RyYXRlZ2llcy5hamF4LndhbnROZXh0UGFnZShkKTpkLnN0cmF0ZWdpZXMuYWpheC53YW50UHJldlBhZ2UoZCl9KX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtYWpheC1zdGFuZGFyZCIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtYWpheCIsZnVuY3Rpb24oZSwKZyl7cmV0dXJue3N0YW5kYXJkOmcsbm9uZTp7d2FudE5leHRQYWdlOmUuY29uc3RhbnRzLk5PT1Asd2FudFByZXZQYWdlOmUuY29uc3RhbnRzLk5PT1Asd2FudEN1cnJlbnRQYWdlOmUuY29uc3RhbnRzLk5PT1Asd2FudDplLmNvbnN0YW50cy5OT09QLGluaXQ6ZS5jb25zdGFudHMuTk9PUH0sImRlZmF1bHQiOiJzdGFuZGFyZCJ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtYWNjZXNzaWJpbGl0eS1zdGFuZGFyZC1kZXNrdG9wIixmdW5jdGlvbihlLGcpe2Z1bmN0aW9uIGsoYSl7dmFyIGM9YS5kb20uJGNhcm91c2VsLGI9Yy5jaGlsZHJlbigibGkiKSxkPWEuZ2V0QXR0cihnLlBBR0VfU0laRSksZT1hLmdldEF0dHIoZy5GSVJTVF9WSVNJQkxFX0lURU0pLTE7cmV0dXJuIGEuZ2V0QXR0cihnLk5PX1RSQU5TSVRJT04pP2I6Yi5sZW5ndGg8PWQ/Yy5jaGlsZHJlbigibGk6bm90KDplbXB0eSksIGxpLmEtY2Fyb3VzZWwtY2FyZC1lbXB0eSIpOgpiLnNsaWNlKGUsZStkKX1mdW5jdGlvbiBmKGEsYyxiLGQpe3ZhciBmPWZ1bmN0aW9uKCl7dmFyIGI9ayhhKTsoYz9iLmZpcnN0KCk6Yi5sYXN0KCkpLmZpbmQoImEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleFx4M2QnLTEnXSkiKS5ub3QoIjpkaXNhYmxlZCIpLmZpcnN0KCkuZm9jdXMoKTtlLmRlbGF5KGZ1bmN0aW9uKCl7aChhKX0sYS5nZXRBdHRyKGcuUEFHRV9TSVpFKSphLmdldEF0dHIoZy5ERUxBWV9USU1FKSs1MCl9O2lmKDA9PT1ifHwwPT09ZCllLmRlbGF5KGYsMCk7ZWxzZSBhLm9uY2UoZy5BTklNQVRJTkcsZnVuY3Rpb24oYSl7YXx8ZigpfSl9ZnVuY3Rpb24gZChhKXt2YXIgYj1hLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksZD1hLmdldEF0dHIoZy5UUkFOU0lUSU9OX1NUUkFURUdZKSxlPWEuZ2V0QXR0cihnLlNFVF9TSVpFKSxmPWU/eyJhcmlhLXNldHNpemUiOmV9Ont9O2lmKCJzd2FwIj09PWQpe3ZhciBoPQphLmdldEF0dHIoZy5GSVJTVF9WSVNJQkxFX0lURU0pO2IuZWFjaChmdW5jdGlvbihhKXt2YXIgYj1jKHRoaXMpO2grYT5lPyhiLnJlbW92ZUF0dHIoImFyaWEtc2V0c2l6ZSIpLGIucmVtb3ZlQXR0cigiYXJpYS1wb3NpbnNldCIpKTooZlsiYXJpYS1wb3NpbnNldCJdPWgrYSxiLmF0dHIoZikpfSl9ZWxzZSBiLmVhY2goZnVuY3Rpb24oYSl7ZlsiYXJpYS1wb3NpbnNldCJdPWErMTtjKHRoaXMpLmF0dHIoZil9KX1mdW5jdGlvbiBoKGEpe2E9YS5kb20uJGNvbnRhaW5lcjthLmZpbmQoIi5hLWNhcm91c2VsLWFjY2Vzc2liaWxpdHktcGFnZS1pbmZvIikuaHRtbChhLmZpbmQoIi5hLWNhcm91c2VsLXBhZ2UtY291bnQiKS50ZXh0KCkpfWZ1bmN0aW9uIGwoYSl7YS5nZXRBdHRyKGcuVFJBTlNJVElPTl9TVFJBVEVHWSk7aWYoIWEuZ2V0QXR0cihnLk5PX1RSQU5TSVRJT04pKXt2YXIgYj1hLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIik7YT1rKGEpO2I9Yi5ub3QoYSk7YS5hdHRyKCJhcmlhLWhpZGRlbiIsCiExKTtiLmF0dHIoImFyaWEtaGlkZGVuIiwhMCl9fWZ1bmN0aW9uIGIoYSxiKXtpZighYS5nZXRBdHRyKGcuQ0lSQ1VMQVIpKXt2YXIgYz1hLmRvbS4kY29udGFpbmVyO2MuZmluZCgiLmEtY2Fyb3VzZWwtZ290by1wcmV2cGFnZSIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLDE9PT1iPyJ0cnVlIjoiZmFsc2UiKTtjLmZpbmQoIi5hLWNhcm91c2VsLWdvdG8tbmV4dHBhZ2UiKS5hdHRyKCJhcmlhLWRpc2FibGVkIixiPT09YS5nZXRBdHRyKGcuVE9UQUxfUEFHRVMpPyJ0cnVlIjoiZmFsc2UiKX19dmFyIGM9ZS4kO3JldHVybntpbml0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cihnLk5BTUUpO2QoYSk7bChhKTtiKGEsMSk7ZS5vbigiYTpjYXJvdXNlbCIrKGM/IjoiK25hbWU6IiIpKyI6cmVwYWludCIsZnVuY3Rpb24oKXtsKGEpfSk7YS5vbkNoYW5nZShnLlNFVF9TSVpFLGZ1bmN0aW9uKGIsYyl7ZChhKX0pO2Eub25DaGFuZ2UoZy5MT0FESU5HLGZ1bmN0aW9uKGIpe2EuZ2V0QXR0cihnLkFOSU1BVElORyl8fAphLmRvbS4kY2Fyb3VzZWwuYXR0cigiYXJpYS1idXN5IiwoISFiKS50b1N0cmluZygpKX0pO2Eub25DaGFuZ2UoZy5BTklNQVRJTkcsZnVuY3Rpb24oYil7YS5nZXRBdHRyKGcuTE9BRElORyl8fGEuZG9tLiRjYXJvdXNlbC5hdHRyKCJhcmlhLWJ1c3kiLCghIWIpLnRvU3RyaW5nKCkpOyFiJiZhLmdldEF0dHIoZy5TRVRfU0laRSk+YS5nZXRBdHRyKGcuUEFHRV9TSVpFKSYmKGI9YS5nZXRBdHRyKGcuVFJBTlNJVElPTl9TVFJBVEVHWSksbChhKSwic2xpZGUiIT09YiYmZChhKSl9KTthLm9uQ2hhbmdlKGcuUEFHRV9OVU1CRVIsZnVuY3Rpb24oYyl7YihhLGMpfSl9LGFmdGVySW5pdDpmdW5jdGlvbihhKXtoKGEpfSxnb3RvUGFnZTpmdW5jdGlvbihhLGIsYyl7YS5nZXRBdHRyKGcuTk9fVFJBTlNJVElPTil8fGYoYSwhMCxiLGMpfSxuZXh0UGFnZTpmdW5jdGlvbihhLGIsYyl7YS5nZXRBdHRyKGcuTk9fVFJBTlNJVElPTil8fGYoYSwhMCxiLGMpfSxwcmV2UGFnZTpmdW5jdGlvbihhLGIsCmMpe2EuZ2V0QXR0cihnLk5PX1RSQU5TSVRJT04pfHxmKGEsITEsYixjKX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtYWNjZXNzaWJpbGl0eS1zdGFuZGFyZC1tb2JpbGUiLGZ1bmN0aW9uKGUsZyl7ZnVuY3Rpb24gayhkKXt2YXIgZT1kLmRvbS4kY2Fyb3VzZWw7ZD1lLmNoaWxkcmVuKCIuYS1jYXJvdXNlbC1jYXJkLWVtcHR5Iik7dmFyIGU9ZS5jaGlsZHJlbigibGkiKS5ub3QoZCksZz1lLmxlbmd0aCxiPWc/eyJhcmlhLXNldHNpemUiOmd9Ont9O2QuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIikucmVtb3ZlQXR0cigiYXJpYS1zZXRzaXplIikucmVtb3ZlQXR0cigiYXJpYS1wb3NpbnNldCIpO2UuZWFjaChmdW5jdGlvbihjKXtiWyJhcmlhLXBvc2luc2V0Il09YysxO2JbImFyaWEtaGlkZGVuIl09ImZhbHNlIjtmKHRoaXMpLmF0dHIoYil9KX12YXIgZj1lLiQ7ZT1lLmNvbnN0YW50cy5OT09QOwpyZXR1cm57aW5pdDpmdW5jdGlvbihkKXtrKGQpO2Qub25DaGFuZ2UoZy5TRVRfU0laRSxmdW5jdGlvbigpe2soZCl9KTtkLm9uQ2hhbmdlKGcuTE9BRElORyxmdW5jdGlvbihlKXtkLmRvbS4kY2Fyb3VzZWwuYXR0cigiYXJpYS1idXN5IiwoISFlKS50b1N0cmluZygpKTtlfHxrKGQpfSl9LGdvdG9QYWdlOmUsbmV4dFBhZ2U6ZSxwcmV2UGFnZTplfX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJhLWNhcm91c2VsLWFjY2Vzc2liaWxpdHktc3RhbmRhcmQtZGVza3RvcCIsImEtY2Fyb3VzZWwtYWNjZXNzaWJpbGl0eS1zdGFuZGFyZC1tb2JpbGUiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1zdHJhdGVnaWVzLWFjY2Vzc2liaWxpdHkiLGZ1bmN0aW9uKGUsZyxrKXtyZXR1cm57c3RhbmRhcmREZXNrdG9wOmcsc3RhbmRhcmRNb2JpbGU6ayxub25lOntpbml0OmUuY29uc3RhbnRzLk5PT1AsZ290b1BhZ2U6ZS5jb25zdGFudHMuTk9PUCxuZXh0UGFnZTplLmNvbnN0YW50cy5OT09QLHByZXZQYWdlOmUuY29uc3RhbnRzLk5PT1B9LAoiZGVmYXVsdCI6ZS5jYXBhYmlsaXRpZXMubW9iaWxlfHxlLmNhcGFiaWxpdGllcy50YWJsZXQ/InN0YW5kYXJkTW9iaWxlIjoic3RhbmRhcmREZXNrdG9wIn19KTsidXNlIHN0cmljdCI7bi53aGVuKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtZGlzcGxheSIsImEtY2Fyb3VzZWwtc3RyYXRlZ2llcy10cmFuc2l0aW9uIiwiYS1jYXJvdXNlbC1zdHJhdGVnaWVzLWFqYXgiLCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtYWNjZXNzaWJpbGl0eSIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMiLGZ1bmN0aW9uKGUsZyxrLGYpe3JldHVybntkaXNwbGF5OmUsdHJhbnNpdGlvbjpnLGFqYXg6ayxhY2Nlc3NpYmlsaXR5OmZ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsImEtdGltaW5nLWFuYWx5dGljcyIsImEtY2Fyb3VzZWwtY2xhc3NlcyIsImEtY2Fyb3VzZWwtc3RyYXRlZ2llcyIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtZnJhbWV3b3JrIiwKZnVuY3Rpb24oZSxnLGssZixkLGgpe2Z1bmN0aW9uIGwoYSxjLGQsZil7Yz1uZXcgYyhhLGQsZik7Yy5fX2lkPSsrQzthLmRhdGEoImEtY2Fyb3VzZWwiLGMpO2EucmVtb3ZlQ2xhc3MoImEtY2Fyb3VzZWwtc3RhdGljIik7cChhKT9lLmRlbGF5KGIsMTAsYyk6dC5wdXNoKGMpO2YubmFtZSYmKHdbZi5uYW1lXT1jKTtyZXR1cm4gY31mdW5jdGlvbiBiKGEpe2EuaW5pdCgpO3IucHVzaChhKTthLl9faW5pdGlhbGl6ZWQ9ITA7YS5kb20uJGNvbnRhaW5lci5hZGRDbGFzcygiYS1jYXJvdXNlbC1pbml0aWFsaXplZCIpO3ZhciBiPWEuZ2V0QXR0cigibmFtZSIpO2ImJnlbYl0mJmUuZWFjaCh5W2JdLGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiBjKGEsYil7KGI9YlthKyJTdHJhdGVneSJdKXx8KGI9ZFthXVsiZGVmYXVsdCJdKTtyZXR1cm4gZFthXVtiXX1mdW5jdGlvbiBhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aCxjO2ItLTspYz1hW2JdLGMuZG9tLiRjb250YWluZXIubGVuZ3RoJiZ6LmZpbmQoYy5kb20uJGNvbnRhaW5lcikubGVuZ3RofHwKKChjPWMuZ2V0QXR0cigibmFtZSIpKSYmZGVsZXRlIHdbY10sYS5zcGxpY2UoYiwxKSl9ZnVuY3Rpb24gcSgpe2EodCk7YShyKX1mdW5jdGlvbiB1KGEpe3ZhciBiPWEuZGF0YSgiYS1jYXJvdXNlbC1vcHRpb25zIil8fHt9O2IuZGlzcGxheVN0cmF0ZWd5PWEuZGF0YSgiYS1kaXNwbGF5LXN0cmF0ZWd5Iik7Yi50cmFuc2l0aW9uU3RyYXRlZ3k9YS5kYXRhKCJhLXRyYW5zaXRpb24tc3RyYXRlZ3kiKTtiLmFqYXhTdHJhdGVneT1hLmRhdGEoImEtYWpheC1zdHJhdGVneSIpO2IuYWNjZXNzaWJpbGl0eVN0cmF0ZWd5PWEuZGF0YSgiYS1hY2Nlc3NpYmlsaXR5LXN0cmF0ZWd5Iik7Yi5jYXJvdXNlbENsYXNzPWEuZGF0YSgiYS1jbGFzcyIpO2E9YygiZGlzcGxheSIsYik7dmFyIGQ9YygidHJhbnNpdGlvbiIsYiksZT1jKCJhamF4IixiKSxnPWMoImFjY2Vzc2liaWxpdHkiLGIpLGg9Yi5jYXJvdXNlbENsYXNzO2h8fChoPWZbImRlZmF1bHQiXSk7aD1mW2hdO2lmKGghPT12JiZhIT09diYmCmQhPT12JiZlIT09diYmZyE9PXYpcmV0dXJue2Nhcm91c2VsQ2xhc3M6aCxzdHJhdGVnaWVzOntkaXNwbGF5OmEsdHJhbnNpdGlvbjpkLGFqYXg6ZSxhY2Nlc3NpYmlsaXR5Omd9LG9wdHM6Yn19ZnVuY3Rpb24gcChhKXtyZXR1cm4gYS5oYXNDbGFzcygiYS1iZWdpbiIpJiYwPT09YS5jaGlsZHJlbigiLmEtZW5kIikubGVuZ3RoPyExOmUub25TY3JlZW4oYSl9ZnVuY3Rpb24gbSgpe2coIi5hLWNhcm91c2VsLXN0YXRpYyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYT1nKHRoaXMpLGI9dShhKTtiJiZsKGEsYi5jYXJvdXNlbENsYXNzLGIuc3RyYXRlZ2llcyxiLm9wdHMpfSl9ZnVuY3Rpb24gQSgpe2Zvcih2YXIgYT10Lmxlbmd0aDthLS07KXt2YXIgYz10W2FdO3AoYy5kb20uJGNvbnRhaW5lcikmJih0LnNwbGljZShhLDEpLGIoYykpfX12YXIgdixyPVtdLHQ9W10seD0hMSx3PXt9LHo9Zyhkb2N1bWVudCkseT17fSxDPTA7ZS5vbigicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIixmdW5jdGlvbihhLApiKXtxKCk7KGIuaGVpZ2h0fHxiLndpZHRoKSYmZS5kZWxheShmdW5jdGlvbigpe2UuZWFjaChyLGZ1bmN0aW9uKGEpe2EucmVzaXplKCl9KX0sZS5jYXBhYmlsaXRpZXMubW9iaWxlfHxlLmNhcGFiaWxpdGllcy50YWJsZXQ/MTAwOjApfSk7ZS5vbigiYTpwb3BvdmVyOmFmdGVyU2xpZGVPdXQiLGZ1bmN0aW9uKCl7ZS5lYWNoKHIsZnVuY3Rpb24oYSl7YS5yZXNpemUoKX0pfSk7ZS5vbigiYTpjYXJvdXNlbDpjaGFuZ2U6bmFtZSIsZnVuY3Rpb24oYSl7YS5uZXdWYWx1ZSYmKHdbYS5uZXdWYWx1ZV09YS5jYXJvdXNlbCk7YS5vbGRWYWx1ZSYmZGVsZXRlIHdbYS5vbGRWYWx1ZV19KTtlLm9uKGguSU5JVF9FVkVOVFMsZnVuY3Rpb24oKXtBKCk7bSgpO2Uub25jZShmdW5jdGlvbigpe2suc3RvcFdpZGdldExvZ2dpbmcoImNhcm91c2VsIil9KSgpfSk7ZS5vbigiYTpwYWdlVXBkYXRlIixxKTtlLm9uKCJzY3JvbGwiLGZ1bmN0aW9uKCl7QSgpO20oKX0pO2UuZGVjbGFyYXRpdmUoImEtdGFicyIsCiJjbGljayIsZnVuY3Rpb24oYSl7ZS5kZWxheShmdW5jdGlvbigpe0EoKTtlLmVhY2gocixmdW5jdGlvbihhKXthLmdldEF0dHIoImlzSW5UYWIiKSYmYS5yZXNpemUoKX0pfSw1MCl9KTtlLm9uKCJhOnBvcG92ZXI6YWZ0ZXJTaG93IixmdW5jdGlvbigpe2UuZGVsYXkoQSw1MCl9KTtlLm9uKCJhOnBvcG92ZXI6YWpheENvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7ZS5kZWxheShmdW5jdGlvbigpe3EoKTttKCl9LDUwKX0pO2Uub24ucmVhZHkoZnVuY3Rpb24oKXt4PSEwfSk7aD17Z2V0Q2Fyb3VzZWw6ZnVuY3Rpb24oYSl7YS5qcXVlcnl8fChhPWcoYSkpO3ZhciBiPWEuY2xvc2VzdCgiLmEtY2Fyb3VzZWwtY29udGFpbmVyIikuZGF0YSgiYS1jYXJvdXNlbCIpO2lmKCFiKXt2YXIgYz11KGEpO2MmJihiPWwoYSxjLmNhcm91c2VsQ2xhc3MsYy5zdHJhdGVnaWVzLGMub3B0cykpfXJldHVybiBifSxnZXRDYXJvdXNlbEJ5TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gd1thXX0sY3JlYXRlQWxsOmZ1bmN0aW9uKCl7cSgpOwptKCl9LGluaXRpYWxpemVBbGw6ZnVuY3Rpb24oKXtxKCk7QSgpfSxraWxsOmZ1bmN0aW9uKGEpe2EuanF1ZXJ5fHwoYT1nKGEpKTtpZihhLmxlbmd0aCYmKGE9YS5jbG9zZXN0KCIuYS1jYXJvdXNlbC1jb250YWluZXIiKSxhLmxlbmd0aCkpe3ZhciBiPWEuZGF0YSgiYS1jYXJvdXNlbCIpO2lmKGIpe3ZhciBjPWUuaW5kZXhPZkFycmF5KHIsYik7LTE8Yz8ocltjXS5uYW1lJiZkZWxldGUgd1tyW2NdLm5hbWVdLHIuc3BsaWNlKGMsMSkpOihjPWUuaW5kZXhPZkFycmF5KHQsYiksLTE8YyYmKHRbY10ubmFtZSYmZGVsZXRlIHdbdFtjXS5uYW1lXSx0LnNwbGljZShjLDEpKSl9YS5yZW1vdmUoKX19LHJlZ2lzdGVyU3RyYXRlZ3k6ZnVuY3Rpb24oYSxiLGMpe2RbYV18fChkLnR5cGU9e30pO2RbYV1bYl0mJm4uZXJyb3IoIkF0dGVtcHRlZCB0byByZWdpc3RlciBhICIrYSsiIHN0cmF0ZWd5IHdoaWNoIGFscmVhZHkgZXhpc3RzOiAiK2IsImEtY2Fyb3VzZWwtZnJhbWV3b3JrIiwicmVnaXN0ZXJTdHJhdGVneSIpOwpkW2FdW2JdPWM7eCYmbSgpfSxyZWdpc3RlckNhcm91c2VsQ2xhc3M6ZnVuY3Rpb24oYSxiKXtmW2FdJiZuLmVycm9yKCJBdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgYSBjYXJvdXNlbCBjbGFzcyB3aGljaCBhbHJlYWR5IGV4aXN0czogIithLCJhLWNhcm91c2VsLWZyYW1ld29yayIsInJlZ2lzdGVyQ2Fyb3VzZWxDbGFzcyIpO2cuaXNGdW5jdGlvbihiKXx8bi5lcnJvcigiQXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGNhcm91c2VsIGNsYXNzICIrYSsiIHdpdGhvdXQgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4iLCJhLWNhcm91c2VsLWZyYW1ld29yayIsInJlZ2lzdGVyQ2Fyb3VzZWxDbGFzcyIpO2ZbYV09Yjt4JiZtKCl9LGdldEFsbENhcm91c2VsczpmdW5jdGlvbigpe3JldHVybiByLmNvbmNhdCh0KX0sb25Jbml0OmZ1bmN0aW9uKGEsYil7YSYmKHlbYV18fCh5W2FdPVtdKSxnLmlzRnVuY3Rpb24oYikmJih5W2FdLnB1c2goYiksKGE9d1thXSkmJmEuX19pbml0aWFsaXplZCYmYihhKSkpfX07Ck9iamVjdC5mcmVlemUhPT12JiZPYmplY3QuZnJlZXplKGgpO3JldHVybiBofSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGUpe3ZhciBoPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsbD1oLl9uYW1lc3BhY2V8fGguYXR0cmlidXRlRXJyb3JzLGI9bD9sKCJBbWF6b25VSUNvbXBvbmVudHMiLCJBbWF6b25VSSIpOmg7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChlKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7ZShiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGUsaCxsKXtlLndoZW4oIkEiLCJhLWZvcm0tY29udHJvbHMtYXBpIikucmVnaXN0ZXIoImEtZm9ybS1jb250cm9scy1oYW5kbGVycyIsZnVuY3Rpb24oYixjKXt2YXIgZD1iLiQsYT1mdW5jdGlvbigpe2QodGhpcykucmVtb3ZlQ2xhc3MoImEtaG92ZXItZGlzYWJsZSIpfSxrPWZ1bmN0aW9uKG0sYSl7dmFyIGs9Yy5maW5kRm9ybUVsZW1lbnRDb250YWluZXIobSk7Yi5kZWxheShmdW5jdGlvbigpe2suZmluZChhKS5lYWNoKGMubm9ybWFsaXplRWxlbWVudCl9LDApfTtyZXR1cm57aGFuZGxlQm94SW5wdXRNb2JpbGVGb2N1czpmdW5jdGlvbigpe2QodGhpcykuYWRkQ2xhc3MoImEtZm9ybS1mb2N1cyIpfSwKaGFuZGxlQm94SW5wdXRNb2JpbGVCbHVyOmZ1bmN0aW9uKCl7ZCh0aGlzKS5yZW1vdmVDbGFzcygiYS1mb3JtLWZvY3VzIil9LGFjY2Vzc2liaWxpdHlLZXlQcmVzczpmdW5jdGlvbihhKXthLmtleUNvZGU9PT1iLmNvbnN0YW50cy5rZXljb2Rlcy5TUEFDRSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKX0sZm9ybVJlc2V0OmssaGFuZGxlQ2hlY2tib3hDbGljazpmdW5jdGlvbigpe2lmKCFiLmNhcGFiaWxpdGllcy5tb2JpbGUmJiFiLmNhcGFiaWxpdGllcy50YWJsZXQpZCh0aGlzKS5hZGRDbGFzcygiYS1ob3Zlci1kaXNhYmxlIikub25lKCJtb3VzZWxlYXZlIixhKX0sbm9ybWFsaXplRm9ybUNvbnRyb2xzOmZ1bmN0aW9uKCl7ZCgiZm9ybSIpLnVuYmluZCgicmVzZXQuYS1mb3JtLWNvbnRyb2xzLXJlc2V0IikuYmluZCgicmVzZXQuYS1mb3JtLWNvbnRyb2xzLXJlc2V0IixmdW5jdGlvbihhKXtrKGEuY3VycmVudFRhcmdldCwibGkgLmEtdG91Y2gtbXVsdGktc2VsZWN0Iil9KX0sCnRvdWNoTXVsdGlTZWxlY3RIYW5kbGVyOmZ1bmN0aW9uKGEpe2MudG9nZ2xlQ2hlY2tib3hTdGF0ZShhLmN1cnJlbnRUYXJnZXQpfX19KTsidXNlIHN0cmljdCI7ZS53aGVuKCJBIiwiYS1mb3JtLWNvbnRyb2xzLWhhbmRsZXJzIiwicmVhZHkiKS5yZWdpc3RlcigiYS1mb3JtLWNvbnRyb2xzIixmdW5jdGlvbihiLGMpe3ZhciBkPWIuJDtkKGRvY3VtZW50KS5kZWxlZ2F0ZSgiLmEtY2hlY2tib3gtZmFuY3kiLCJjbGljayIsYy5oYW5kbGVDaGVja2JveENsaWNrKS5kZWxlZ2F0ZSgiLmEtY2hlY2tib3gtZmFuY3ksIC5hLXJhZGlvLWZhbmN5Iiwia2V5cHJlc3MiLGMuYWNjZXNzaWJpbGl0eUtleVByZXNzKTtiLm9uKCJhOnBhZ2VVcGRhdGUgYmVmb3JlUmVhZHkiLGMubm9ybWFsaXplRm9ybUNvbnRyb2xzKX0pOyJ1c2Ugc3RyaWN0IjtlLndoZW4oIkEiKS5yZWdpc3RlcigiYS1idXR0b25zIixmdW5jdGlvbihiKXt2YXIgYz1iLiQsZD0wO2IuZGVjbGFyYXRpdmUoImEtYnV0dG9uLWdyb3VwIiwKWyJjbGljayJdLGZ1bmN0aW9uKGEpe3ZhciBjPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1idXR0b246bm90KC5hLWJ1dHRvbi1kaXNhYmxlZCkiKTtpZihjLmxlbmd0aCl7dmFyIG09YS4kZGVjbGFyYXRpdmVQYXJlbnQuZmluZCgiLmEtYnV0dG9uIiksZj1hLmRhdGEmJmEuZGF0YS5uYW1lP2EuZGF0YS5uYW1lOiExO2E9YS4kdGFyZ2V0LmNsb3Nlc3QoImlucHV0W3R5cGVceDNkc3VibWl0XSwgYnV0dG9uIikuYXR0cigibmFtZSIpO20ucmVtb3ZlQ2xhc3MoImEtYnV0dG9uLXNlbGVjdGVkIikuYXR0cigiYXJpYS1jaGVja2VkIiwiZmFsc2UiKTtjLmFkZENsYXNzKCJhLWJ1dHRvbi1zZWxlY3RlZCIpLmF0dHIoImFyaWEtY2hlY2tlZCIsInRydWUiKTtpZihhfHxmKWM9eyRidXR0b246YyxidXR0b25OYW1lOmEsYnV0dG9uR3JvdXBOYW1lOmZ9LGYmJihiLnRyaWdnZXIoImE6YnV0dG9uLWdyb3VwOiIrZisiOnRvZ2dsZSIse3NlbGVjdGVkQnV0dG9uOmN9KSxhJiZiLnRyaWdnZXIoImE6YnV0dG9uLWdyb3VwOiIrCmYrIjoiK2ErIjp0b2dnbGUiLHtzZWxlY3RlZEJ1dHRvbjpjfSkpfX0pO2Iub24oImE6cGFnZVVwZGF0ZSBiZWZvcmVSZWFkeSIsZnVuY3Rpb24oKXt2YXIgYT1jKCIuYS1idXR0b246bm90KFtpZF0pIiksYj1jKCIuYS1idXR0b24tZ3JvdXAsLmEtYnV0dG9uLXRvZ2dsZS1ncm91cCIpO2EuZWFjaChmdW5jdGlvbigpe3ZhciBhPWModGhpcyksYj1hLmZpbmQoIi5hLWJ1dHRvbi10ZXh0IiksZT1hLmZpbmQoIi5hLWJ1dHRvbi1pbnB1dCIpLGc9ImEtYXV0b2lkLSIrZCsrO2EuYXR0cigiaWQiLGcpO2IubGVuZ3RoJiYoZz0oYT1iLmF0dHIoImlkIikpP2E6ZysiLWFubm91bmNlIixlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIsZyksYi5hdHRyKCJpZCIsZykpfSk7Yi5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9Yyh0aGlzKS5maW5kKCIuYS1idXR0b25bcm9sZVx4M2QncmFkaW8nXSIpLGI9YS5sZW5ndGgsZD0xO2EuZWFjaChmdW5jdGlvbigpe2ModGhpcykuYXR0cih7ImFyaWEtcG9zaW5zZXQiOmQrKywKImFyaWEtc2V0c2l6ZSI6Yn0pfSl9KX0pO2MoZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1idXR0b24taW5wdXQsIC5hLWJ1dHRvbi10ZXh0IiwiZm9jdXNpbiIsZnVuY3Rpb24oKXt2YXIgYT1jKHRoaXMpLmNsb3Nlc3QoIi5hLWJ1dHRvbiIpO2EuaGFzQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIil8fGEuYWRkQ2xhc3MoImEtYnV0dG9uLWZvY3VzIil9KS5kZWxlZ2F0ZSgiLmEtYnV0dG9uLWlucHV0LCAuYS1idXR0b24tdGV4dCIsImZvY3Vzb3V0ICIrYi5hY3Rpb24uY2FuY2VsLGZ1bmN0aW9uKCl7Yyh0aGlzKS5jbG9zZXN0KCIuYS1idXR0b24iKS5yZW1vdmVDbGFzcygiYS1idXR0b24tZm9jdXMiKX0pfSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGUpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBbWF6b25VSVRhYnMiLCJBbWF6b25VSSIpOmI7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChlKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7ZShhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGUsYixkKXtlLndoZW4oIkEiKS5yZWdpc3RlcigiYS10YWJzIixmdW5jdGlvbihhKXt2YXIgZT1hLiQ7YS5kZWNsYXJhdGl2ZSgiYS10YWJzIixbImNsaWNrIl0sZnVuY3Rpb24oYil7dmFyIGM9Yi4kdGFyZ2V0LmNsb3Nlc3QoImxpIiksZD1iLmRhdGEubmFtZSxmPWMuZGF0YSgiYS10YWItbmFtZSIpLGc9Yy5jbG9zZXN0KCIuYS10YWItY29udGFpbmVyIikuZmluZCgiLmEtYm94LXRhYiIpO2YmJihlKCJsaS5hLWFjdGl2ZSIsYy5jbG9zZXN0KCIuYS10YWJzIikpLnJlbW92ZUNsYXNzKCJhLWFjdGl2ZSIpLGMuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygiYS1hY3RpdmUiKSwKZy5hZGRDbGFzcygiYS1oaWRkZW4iKSxnLmZpbHRlcignW2RhdGEtYS1uYW1lXHgzZCInK2YrJyJdJykucmVtb3ZlQ2xhc3MoImEtaGlkZGVuIiksYz17JHRhYjpjLHRhYk5hbWU6Zix0YWJTZXROYW1lOmR9LGEudHJpZ2dlcigiYTp0YWJzOiIrZCsiOnNlbGVjdCIse3NlbGVjdGVkVGFiOmN9KSxhLnRyaWdnZXIoImE6dGFiczoiK2QrIjoiK2YrIjpzZWxlY3QiLHtzZWxlY3RlZFRhYjpjfSksYi4kZXZlbnQucHJldmVudERlZmF1bHQoKSl9KX0pfSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihjKXt2YXIgZz13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLGY9Zy5fbmFtZXNwYWNlfHxnLmF0dHJpYnV0ZUVycm9ycyxhPWY/ZigiQW1hem9uVUlBY2NvcmRpb24iLCJBbWF6b25VSSIpOmc7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChjKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7YyhhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsZyxmKXtjLndoZW4oIkEiKS5yZWdpc3RlcigiYS1hY2NvcmRpb24tYTExeSIsZnVuY3Rpb24oYSl7dmFyIGM9YS4kLGQ7cmV0dXJue3JlZnJlc2hGb2N1czpmdW5jdGlvbihoLGUpe2U9ZXx8NjAwO2R8fChkPWMoIlx4M2NiIC9ceDNlIix7ImNsYXNzIjoiYS1hY2NvcmRpb24tYTExeSIsdGFiSW5kZXg6LTEsc3R5bGU6InBvc2l0aW9uOiBhYnNvbHV0ZSJ9KS5hcHBlbmRUbygiYm9keSIpKTtkLmNzcyh7ZGlzcGxheToiYmxvY2sifSkub2Zmc2V0KGgub2Zmc2V0KCkpO2EuZGVsYXkoZnVuY3Rpb24oKXtkLmZvY3VzKCl9LAo1MCk7YS5kZWxheShmdW5jdGlvbigpe2guZm9jdXMoKTtkLmNzcyh7ZGlzcGxheToibm9uZSJ9KX0sZSl9fX0pO2Mud2hlbigiQSIsImEtYWNjb3JkaW9uLWExMXkiKS5yZWdpc3RlcigiYS1hY2NvcmRpb24iLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9InNsaWRlRG93biIsaD0ic2xpZGVVcCIsZT0zMDA7aWYoYS5jYXBhYmlsaXRpZXMubW9iaWxlfHxhLmNhcGFiaWxpdGllcy50YWJsZXQpZD0ic2hvdyIsaD0iaGlkZSIsZT0wO3ZhciBnPSFhLmNhcGFiaWxpdGllcy50b3VjaCYmYS5jYXBhYmlsaXRpZXMuaXNGaXJlZm94O2EuZGVjbGFyYXRpdmUoImEtYWNjb3JkaW9uIixbImNsaWNrIl0sZnVuY3Rpb24obSl7dmFyIGs9bS4kdGFyZ2V0LmNsb3Nlc3QoIi5hLWFjY29yZGlvbiIpLGI9bS4kdGFyZ2V0LmNsb3Nlc3QoIi5hLWJveCIpLGY9ay5maW5kKCIuYS1ib3giKS5ub3QoYiksbD1iLmZpbmQoIi5hLWFjY29yZGlvbi1yb3ciKSxuPWsuZGF0YSgiYS1hY2NvcmRpb24tbmFtZSIpLHA9Yi5kYXRhKCJhLWFjY29yZGlvbi1yb3ctbmFtZSIpLAp1PWsuaGFzQ2xhc3MoImEtYWNjb3JkaW9uLWNvbGxhcHNlIikscT1tLiR0YXJnZXQuY2xvc2VzdCgiLmEtYWNjb3JkaW9uLXJvdy1hMTF5Iiksaz1rLmZpbmQoIi5hLWFjY29yZGlvbi1yb3ctYTExeSIpLm5vdChxKTtpZihwKXt2YXIgdD1iLmZpbmQoIi5hLWFjY29yZGlvbi1pbm5lciIpLHI9ITA7aWYoYi5oYXNDbGFzcygiYS1hY2NvcmRpb24tYWN0aXZlIikpaWYodSl0W2hdKHtkdXJhdGlvbjplLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVDbGFzcygiYS1hY2NvcmRpb24tYWN0aXZlIik7Yi5maW5kKCIuYS1pY29uLmEtYWNjb3JkaW9uLXJhZGlvIikucmVtb3ZlQ2xhc3MoImEtaWNvbi1yYWRpby1hY3RpdmUiKS5hZGRDbGFzcygiYS1pY29uLXJhZGlvLWluYWN0aXZlIik7cS5hdHRyKCJhcmlhLWNoZWNrZWQiLCJmYWxzZSIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpfX0pO2Vsc2Ugcj0hMTtlbHNlIGYuZmluZCgiLmEtYWNjb3JkaW9uLWlubmVyIilbaF0oe2R1cmF0aW9uOmUsCmNvbXBsZXRlOmZ1bmN0aW9uKCl7Zi5yZW1vdmVDbGFzcygiYS1hY2NvcmRpb24tYWN0aXZlIil9fSksdFtkXSh7ZHVyYXRpb246ZSxjb21wbGV0ZTpmdW5jdGlvbigpe2IuYWRkQ2xhc3MoImEtYWNjb3JkaW9uLWFjdGl2ZSIpO2YuZmluZCgiLmEtaWNvbi5hLWFjY29yZGlvbi1yYWRpbyIpLnJlbW92ZUNsYXNzKCJhLWljb24tcmFkaW8tYWN0aXZlIikuYWRkQ2xhc3MoImEtaWNvbi1yYWRpby1pbmFjdGl2ZSIpO2IuZmluZCgiLmEtaWNvbi5hLWFjY29yZGlvbi1yYWRpbyIpLnJlbW92ZUNsYXNzKCJhLWljb24tcmFkaW8taW5hY3RpdmUiKS5hZGRDbGFzcygiYS1pY29uLXJhZGlvLWFjdGl2ZSIpfX0pLGsuYXR0cigiYXJpYS1jaGVja2VkIiwiZmFsc2UiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxxLmF0dHIoImFyaWEtY2hlY2tlZCIsInRydWUiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpO3ImJmcmJmMucmVmcmVzaEZvY3VzKGwpO3ImJihsPXskcm93OmIscm93TmFtZTpwLAphY2NvcmRpb25OYW1lOm59LGEudHJpZ2dlcigiYTphY2NvcmRpb246c2VsZWN0Iix7c2VsZWN0ZWRSb3c6bH0pLGEudHJpZ2dlcigiYTphY2NvcmRpb246IituKyI6c2VsZWN0Iix7c2VsZWN0ZWRSb3c6bH0pLGEudHJpZ2dlcigiYTphY2NvcmRpb246IituKyI6IitwKyI6c2VsZWN0Iix7c2VsZWN0ZWRSb3c6bH0pKX1tLiRldmVudC5wcmV2ZW50RGVmYXVsdCgpfSl9KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24oZSl7dmFyIGw9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxmPWwuX25hbWVzcGFjZXx8bC5hdHRyaWJ1dGVFcnJvcnMsYj1mP2YoIkFtYXpvblVJRXhwYW5kZXIiLCJBbWF6b25VSSIpOmw7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChlKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7ZShiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGUsbCxmKXtlLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1leHBhbmRlciIsZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBsKGEsbSl7dmFyIGI9YS5jbG9zZXN0KCIuIitjLmNvbnRhaW5lciksZz1iLmRhdGEoImEtZXhwYW5kZXItY29sbGFwc2VkLWhlaWdodCIpLGQ9InRydWUiPT09YS5hdHRyKCJhcmlhLWV4cGFuZGVkIik7YS50b2dnbGVDbGFzcyhjLmNvbnRlbnQrIi1leHBhbmRlZCIpO2c/KGIuY3NzKCJoZWlnaHQiLGQ/ZzoiYXV0byIpLGEuYXR0cigiYXJpYS1leHBhbmRlZCIsZD8iZmFsc2UiOiJ0cnVlIiksCm0oKSk6YS50b2dnbGUoMCxmdW5jdGlvbigpe2EuYXR0cigiYXJpYS1leHBhbmRlZCIsZD8iZmFsc2UiOiJ0cnVlIik7bSgpfSl9ZnVuY3Rpb24gZigpe2UoIi5hLWV4cGFuZGVyLXBhcnRpYWwtY29sbGFwc2UtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpe3ZhciBhPWUodGhpcyksYj1hLmNoaWxkcmVuKCIuIitjLmNvbnRlbnQpLGQ9YS5kYXRhKCJhLWV4cGFuZGVyLWNvbGxhcHNlZC1oZWlnaHQiKSxnPWEuY2hpbGRyZW4oIi4iK2MuaGVhZGVyKTtiLmhlaWdodCgpPD1kP2cuY3NzKHtvcGFjaXR5OiIwIixkaXNwbGF5OiJub25lIn0pOihnLmNzcyh7b3BhY2l0eToiMSIsZGlzcGxheToiYmxvY2sifSksYi5jc3MoInBhZGRpbmctYm90dG9tIixnLmhlaWdodCgpKSwidHJ1ZSIhPT1iLmF0dHIoImFyaWEtZXhwYW5kZWQiKSYmYS5jc3Moe2hlaWdodDpkLCJtYXgtaGVpZ2h0Ijoibm9uZSJ9KSl9KX12YXIgbj17aW5saW5lOntleHBhbmQ6ImEtaWNvbi1leHBhbmQiLGNvbGxhcHNlOiJhLWljb24tY29sbGFwc2UifSwKc2VjdGlvbjp7ZXhwYW5kOiJhLWljb24tc2VjdGlvbi1leHBhbmQiLGNvbGxhcHNlOiJhLWljb24tc2VjdGlvbi1jb2xsYXBzZSJ9LGV4dGVuZGVyOntleHBhbmQ6ImEtaWNvbi1leHRlbmRlci1leHBhbmQiLGNvbGxhcHNlOiJhLWljb24tZXh0ZW5kZXItY29sbGFwc2UifX0sYz17Y29udGFpbmVyOiJhLWV4cGFuZGVyLWNvbnRhaW5lciIsY29udGVudDoiYS1leHBhbmRlci1jb250ZW50IixoZWFkZXI6ImEtZXhwYW5kZXItaGVhZGVyIixmYWRlRGl2OiJhLWV4cGFuZGVyLWNvbnRlbnQtZmFkZSJ9LGQ9e307Yi5lYWNoKG4sZnVuY3Rpb24oYSxjKXtkW2NdPXt9O2IuZWFjaChhLGZ1bmN0aW9uKGEsYil7ZFtjXVtiXT1uZXcgUmVnRXhwKCJcXGIiK2ErIlxcYiIsImciKX0pfSk7Yi5kZWNsYXJhdGl2ZSgiYS1leHBhbmRlci10b2dnbGUiLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIG09YS4kdGFyZ2V0LmNsb3Nlc3QoIi4iK2MuY29udGFpbmVyKSxlPW0uZmluZCgiLiIrYy5jb250YWluZXIpLApnPW0uZGF0YSgiYS1leHBhbmRlci1uYW1lIiksZjtmPWEuJGN1cnJlbnRUYXJnZXQuaGFzQ2xhc3MoYy5oZWFkZXIpP2EuJGN1cnJlbnRUYXJnZXQ6bS5maW5kKCIuIitjLmhlYWRlcikubm90KGUuZmluZCgiLiIrYy5oZWFkZXIpKTt2YXIgcD1tLmZpbmQoIi4iK2MuY29udGVudCkubm90KGUuZmluZCgiLiIrYy5jb250ZW50KSk7bChwLGZ1bmN0aW9uKCl7dmFyIGg9Zi5maW5kKCIuYS1pY29uIilbMF0saz1udWxsLGw9Zi5jaGlsZHJlbigiLiIrYy5mYWRlRGl2KTsiZmFsc2UiPT09cC5hdHRyKCJhcmlhLWV4cGFuZGVkIik/KGgmJihoLmNsYXNzTmFtZT1oLmNsYXNzTmFtZS5yZXBsYWNlKGQuaW5saW5lLmNvbGxhcHNlLG4uaW5saW5lLmV4cGFuZCkucmVwbGFjZShkLnNlY3Rpb24uY29sbGFwc2Usbi5zZWN0aW9uLmV4cGFuZCkucmVwbGFjZShkLmV4dGVuZGVyLmNvbGxhcHNlLG4uZXh0ZW5kZXIuZXhwYW5kKSksYS5kYXRhJiZhLmRhdGEuZXhwYW5kX3Byb21wdCYmKGs9YS5kYXRhLmV4cGFuZF9wcm9tcHQpLApsLnNob3coKSxoPSJjb2xsYXBzZSIpOihoJiYoaC5jbGFzc05hbWU9aC5jbGFzc05hbWUucmVwbGFjZShkLmlubGluZS5leHBhbmQsbi5pbmxpbmUuY29sbGFwc2UpLnJlcGxhY2UoZC5zZWN0aW9uLmV4cGFuZCxuLnNlY3Rpb24uY29sbGFwc2UpLnJlcGxhY2UoZC5leHRlbmRlci5leHBhbmQsbi5leHRlbmRlci5jb2xsYXBzZSkpLGEuZGF0YSYmYS5kYXRhLmNvbGxhcHNlX3Byb21wdCYmKGs9YS5kYXRhLmNvbGxhcHNlX3Byb21wdCksbC5oaWRlKCksaD0iZXhwYW5kIik7ayYmIiIhPT1rJiZmLmZpbmQoIi5hLWV4cGFuZGVyLXByb21wdCIpLm5vdChlLmZpbmQoIi5hLWV4cGFuZGVyLXByb21wdCIpKS5odG1sKGspO2s9eyRleHBhbmRlcjptLGV4cGFuZGVyTmFtZTpnfTtiLnRyaWdnZXIoImE6ZXhwYW5kZXI6dG9nZ2xlIix7ZXhwYW5kZXI6a30pO2IudHJpZ2dlcigiYTpleHBhbmRlcjp0b2dnbGU6IitoLHtleHBhbmRlcjprfSk7ZyYmKGIudHJpZ2dlcigiYTpleHBhbmRlcjoiK2crCiI6dG9nZ2xlIix7ZXhwYW5kZXI6a30pLGIudHJpZ2dlcigiYTpleHBhbmRlcjoiK2crIjp0b2dnbGU6IitoLHtleHBhbmRlcjprfSkpfSl9KTtiLm9uKCJsb2FkIHJlYWR5IHJlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZSBhOnBvcG92ZXI6YWZ0ZXJTaG93IGE6cG9wb3ZlcjphamF4Q29udGVudExvYWRlZCIsZik7cmV0dXJue2luaXRpYWxpemVFeHBhbmRlcnM6Zn19KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24oaCl7dmFyIGU9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxuPWUuX25hbWVzcGFjZXx8ZS5hdHRyaWJ1dGVFcnJvcnMsZD1uP24oIkFtYXpvblVJU3dpdGNoIiwiQW1hem9uVUkiKTplO2QuZ3VhcmRGYXRhbD9kLmd1YXJkRmF0YWwoaCkoZCx3aW5kb3cpOmQuZXhlY3V0ZShmdW5jdGlvbigpe2goZCx3aW5kb3cpfSl9KShmdW5jdGlvbihoLGUsbil7aC53aGVuKCJhLXN3aXRjaC1mcmFtZXdvcmsiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1zd2l0Y2giLGZ1bmN0aW9uKGQsZyl7dmFyIGw9ZC5TV0lUQ0hfU1RBVEUsaD1kLlNXSVRDSF9DT05UQUlORVJfQ0xBU1MscD1kLlNXSVRDSF9DTEFTUztyZXR1cm57Z2V0U3dpdGNoOmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGsoYyl7dmFyIG09Zi5kYXRhKGwpO2lmKHZvaWQgMD09PWMpcmV0dXJuIG0uaXNPbjtpZighbS5pc0VuYWJsZWR8fGUoZikpcmV0dXJuITE7ZC5zZXRPblN0YXRlKGYsYyk7cmV0dXJuITB9ZnVuY3Rpb24gZSgpe3JldHVybiBmLmRhdGEobCkuaXNEcmFnZ2luZ30KYy5qcXVlcnl8fChjPWcoYykpO2lmKDA9PT1jLmxlbmd0aClyZXR1cm4gbnVsbDtjPWMuZXEoMCk7Yz1jLmNsb3Nlc3QoIi4iK2gpO2lmKDA9PT1jLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgZj1jLmZpbmQoIi4iK3ApO2QuZW5zdXJlSW5pdGlhbGl6ZWQoZik7cmV0dXJue3RvZ2dsZTpmdW5jdGlvbigpe3JldHVybiBrKCFmLmRhdGEobCkuaXNPbil9LGlzT246ayxlbmFibGVkOmZ1bmN0aW9uKGMpe3ZhciBtPWYuZGF0YShsKTtpZih2b2lkIDA9PT1jKXJldHVybiBtLmlzRW5hYmxlZDtpZihtLmlzRW5hYmxlZD09PWMpcmV0dXJuITE7ZC5zZXRFbmFibGVkKGYsYyk7cmV0dXJuITB9LGlzRHJhZ2dpbmc6ZSxsYWJlbDpmdW5jdGlvbihkKXt2YXIgYz1mLmRhdGEobCkubGFiZWwsaD1jWzBdLmNoaWxkTm9kZXNbMF07aWYodm9pZCAwPT09ZClyZXR1cm4gYy50ZXh0KCk7Mz09PWgubm9kZVR5cGUmJihoLnRleHRDb250ZW50PWQpfX19fX0pOyJ1c2Ugc3RyaWN0IjtoLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1zd2l0Y2gtZnJhbWV3b3JrIiwKZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBsKGEpe2EucHJldmVudERlZmF1bHQoKTt2YXIgYj1hLmRhdGEuJHN3aXRjaC5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpLGM9Yi5jb250cm9sO2lmKCFkLmlzQW5pbWF0ZWQoYykpe2E9cShhKS1iLmluaXRpYWxYO2IuaXNPbiYmKGErPWIucmlnaHRCb3VuZGFyeSk7dmFyIGU9Yi5sZWZ0Qm91bmRhcnksdj1iLnJpZ2h0Qm91bmRhcnk7YT1hPGU/ZTphPnY/djphO2EhPT1iLmxlZnRPZmZzZXQmJihkLmFuaW1hdGUoYyx7bGVmdDphfSwwKSxiLmxlZnRPZmZzZXQ9YSxiLmlzRHJhZ2dpbmc9ITAsYi5kcmFnQ291bnQrKyl9fWZ1bmN0aW9uIGUoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKGQuY2FwYWJpbGl0aWVzLnRvdWNofHwxPT09YS53aGljaCl7YT1hLmRhdGEuJHN3aXRjaDt2YXIgYj1hLmRhdGEoImEtc3dpdGNoLXN0YXRlIik7ayhhLGIuaXNEcmFnZ2luZyYmMTxiLmRyYWdDb3VudD9iLmxlZnRPZmZzZXQ+Yi5taWRQb2ludDohYi5pc09uKTtiLmlzRHJhZ2dpbmc9CiExO3QoYSl9fWZ1bmN0aW9uIHAoYSxiLGMpe2M9e3N3aXRjaFN0YXRlOmEscHJldmlvdXNTdGF0ZTpjfTtkLnRyaWdnZXIoImE6c3dpdGNoOiIrYixjKTthLm5hbWUmJmQudHJpZ2dlcigiYTpzd2l0Y2g6IithLm5hbWUrIjoiK2IsYyl9ZnVuY3Rpb24gYyhhKXtpZighYS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpKXt2YXIgYj1hLmNsb3Nlc3QoIi5hLXN3aXRjaC1yb3ciKSxjPWEuY2hpbGRyZW4oIi5hLXN3aXRjaC1jb250cm9sIiksZD1iLmZpbmQoIi5hLXN3aXRjaC1sYWJlbCIpLGU9ZC5zaWJsaW5ncygiaW5wdXQiKSxoPWUuYXR0cigibmFtZSIpLGY9Yi5oYXNDbGFzcygiYS1hY3RpdmUiKSxsPSFiLmhhc0NsYXNzKCJhLWRpc2FibGVkIiksZz1yLmxlZnQsaz1hLndpZHRoKCktYy53aWR0aCgpK3IucmlnaHQ7YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIse2lucHV0OmUsY29udGFpbmVyOmIsY29udHJvbDpjLGxhYmVsOmQsaXNEcmFnZ2luZzohMSxyaWdodEJvdW5kYXJ5OmssbGVmdEJvdW5kYXJ5OmcsCm1pZFBvaW50OmsvMixpbml0aWFsWDpudWxsLGxlZnRPZmZzZXQ6Zj9rOmcsbWF4TGVmdE9mZnNldDpyLm1heExlZnRPZmZzZXQsaXNPbjpmLGlzRW5hYmxlZDpsLG5hbWU6aCxkcmFnQ291bnQ6MCxjbGlja2VkOiExfSl9fWZ1bmN0aW9uIGsoYSxiKXtjKGEpO2E9YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpO3ZhciBlPWEuaXNPbixoPWIhPT1hLmlzT247YS5pc09uPWI7dmFyIGY9YS5jb250cm9sLGs9YS5tYXhMZWZ0T2Zmc2V0LGc9YS5pc09uP2EucmlnaHRCb3VuZGFyeTphLmxlZnRCb3VuZGFyeSxnPWsmJmc+az9rOmc7ZC5hbmltYXRlKGYse2xlZnQ6Z30sMzAwLCJlYXNlLW91dCIpO2EubGVmdE9mZnNldD1nO2Y9YS5jb250YWluZXI7YS5pc09uP2YuYWRkQ2xhc3MoImEtYWN0aXZlIik6Zi5yZW1vdmVDbGFzcygiYS1hY3RpdmUiKTtmPWEuaW5wdXQ7YS5pc09uP2YuYXR0cigiY2hlY2tlZCIsImNoZWNrZWQiKTpmLnJlbW92ZUF0dHIoImNoZWNrZWQiKTtoJiZwKGEsImZsaXAiLAplKTtiP3AoYSwib24iLGUpOnAoYSwib2ZmIixlKX12YXIgbj1mdW5jdGlvbihhKXthLmJpbmQoInRvdWNobW92ZS5hLXN3aXRjaC1jb21wb25lbnQiLHskc3dpdGNoOmF9LGwpO2EuYmluZCgidG91Y2hlbmQuYS1zd2l0Y2gtY29tcG9uZW50Iix7JHN3aXRjaDphfSxlKTthLmJpbmQoInRvdWNoY2FuY2VsLmEtc3dpdGNoLWNvbXBvbmVudCIseyRzd2l0Y2g6YX0sZSk7YS5iaW5kKCJtb3VzZXVwLmEtc3dpdGNoLWNvbXBvbmVudCIseyRzd2l0Y2g6YX0sZSl9LGY9ZnVuY3Rpb24oYSl7YS51bmJpbmQoInRvdWNobW92ZS5hLXN3aXRjaC1jb21wb25lbnQiKTthLnVuYmluZCgidG91Y2hlbmQuYS1zd2l0Y2gtY29tcG9uZW50Iik7YS51bmJpbmQoInRvdWNoY2FuY2VsLmEtc3dpdGNoLWNvbXBvbmVudCIpO2EudW5iaW5kKCJtb3VzZXVwLmEtc3dpdGNoLWNvbXBvbmVudCIpfSx3PWZ1bmN0aW9uKGEpe3JldHVybihhLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXXx8YS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKS5wYWdlWH0sCm09ZnVuY3Rpb24oYSl7ZygiYm9keSIpLmJpbmQoIm1vdXNlbW92ZS5hLXN3aXRjaC1jb21wb25lbnQiLHskc3dpdGNoOmF9LGwpO2coImJvZHkiKS5iaW5kKCJtb3VzZXVwLmEtc3dpdGNoLWNvbXBvbmVudCIseyRzd2l0Y2g6YX0sZSl9LHg9ZnVuY3Rpb24oYSl7ZygiYm9keSIpLnVuYmluZCgibW91c2Vtb3ZlLmEtc3dpdGNoLWNvbXBvbmVudCIsbCk7ZygiYm9keSIpLnVuYmluZCgibW91c2V1cC5hLXN3aXRjaC1jb21wb25lbnQiLGUpfSx5PWZ1bmN0aW9uKGEpe3JldHVybiBhLnBhZ2VYfSxyPXtsZWZ0Oi0xLHJpZ2h0Oi0xfTtoLndoZW4oInBydjpza2luLXZhcnMiKS5leGVjdXRlKGZ1bmN0aW9uKGEpe3I9YS50b2dnbGUuYm91bmRzfSk7dmFyIHU9bnVsbCx0PW51bGwscT1udWxsO2QuY2FwYWJpbGl0aWVzLnRvdWNoPyh1PW4sdD1mLHE9dyk6KHU9bSx0PXgscT15KTtkLmRlY2xhcmF0aXZlKCJhLXN3aXRjaCIsZC5jYXBhYmlsaXRpZXMudG91Y2g/InRvdWNoc3RhcnQiOiJtb3VzZWRvd24iLApmdW5jdGlvbihhKXt2YXIgYj1hLiRldmVudDtiLnByZXZlbnREZWZhdWx0KCk7aWYoZC5jYXBhYmlsaXRpZXMudG91Y2h8fDE9PT1iLndoaWNoKXthPWEuJGRlY2xhcmF0aXZlUGFyZW50O2MoYSk7dmFyIGU9YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpO2UuZHJhZ0NvdW50PTA7ZS5jbGlja2VkPSEwO2UuaXNEcmFnZ2luZz0hMTtlLmlzRW5hYmxlZCYmKGUuaW5pdGlhbFg9cShiKSx1KGEpKX19KTtkLmRlY2xhcmF0aXZlKCJhLXN3aXRjaC1pbnB1dCIsImNoYW5nZSIsZnVuY3Rpb24oYSl7YS4kZXZlbnQucHJldmVudERlZmF1bHQoKTthPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1zd2l0Y2gtcm93IikuZmluZCgiLmEtc3dpdGNoIik7YyhhKTt2YXIgYj1hLmRhdGEoImEtc3dpdGNoLXN0YXRlIik7ayhhLCFiLmlzT24pfSk7ZC5kZWNsYXJhdGl2ZSgiYS1zd2l0Y2gtbGFiZWwiLCJjbGljayIsZnVuY3Rpb24oYSl7YS4kZXZlbnQucHJldmVudERlZmF1bHQoKTthPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1zd2l0Y2gtcm93IikuZmluZCgiLmEtc3dpdGNoIik7CmMoYSk7dmFyIGI9YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpO2IuY2xpY2tlZD9iLmNsaWNrZWQ9ITE6Yi5pc0VuYWJsZWQmJmsoYSwhYi5pc09uKX0pO2gud2hlbigicmVhZHkiKS5leGVjdXRlKCJhLXN3aXRjaC1ub3JtYWxpemF0aW9uIixmdW5jdGlvbigpe2coIi5hLXN3aXRjaC1pbnB1dCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYT1nKHRoaXMpLGI9YS5uZXh0KCkuY2hpbGRyZW4oIi5hLXN3aXRjaCIpO2soYixhLnByb3AoImNoZWNrZWQiKSl9KX0pO3JldHVybntlbnN1cmVJbml0aWFsaXplZDpjLHNldE9uU3RhdGU6ayxzZXRFbmFibGVkOmZ1bmN0aW9uKGEsYil7YyhhKTthPWEuZGF0YSgiYS1zd2l0Y2gtc3RhdGUiKTt2YXIgZD1hLmNvbnRhaW5lcjtiP2QucmVtb3ZlQ2xhc3MoImEtZGlzYWJsZWQiKTpkLmFkZENsYXNzKCJhLWRpc2FibGVkIik7YS5pc0VuYWJsZWQ9Yn0sU1dJVENIX1NUQVRFOiJhLXN3aXRjaC1zdGF0ZSIsU1dJVENIX0NPTlRBSU5FUl9DTEFTUzoiYS1zd2l0Y2gtcm93IiwKU1dJVENIX0NMQVNTOiJhLXN3aXRjaCJ9fSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGIpe3ZhciBhPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZz1hLl9uYW1lc3BhY2V8fGEuYXR0cmlidXRlRXJyb3JzLGU9Zz9nKCJBbWF6b25VSVByb2dyZXNzQmFyIiwiQW1hem9uVUkiKTphO2UuZ3VhcmRGYXRhbD9lLmd1YXJkRmF0YWwoYikoZSx3aW5kb3cpOmUuZXhlY3V0ZShmdW5jdGlvbigpe2IoZSx3aW5kb3cpfSl9KShmdW5jdGlvbihiLGEsZyl7Yi53aGVuKCJBIiwicmVhZHkiKS5yZWdpc3RlcigiYS1wcm9ncmVzcyIsZnVuY3Rpb24oZSl7ZnVuY3Rpb24gYihhKXsoYT9mKGEpOmYoIi5hLWpzLXByb2dyZXNzLWJhciIpKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKTtpZihlLm9uU2NyZWVuKGIsMCkpe3ZhciBhLGgsYyxnO2E9K2IuYXR0cigiZGF0YS1wcm9ncmVzcy1wZXJjZW50YWdlIik7aD0tKGEtMTAwKTtjPWIud2lkdGgoKTtnPWgvMTAwKmM7dmFyIGQ9Yi5maW5kKCIuYS1qcy1wcm9ncmVzcy10b29sdGlwIiksaz1kLndpZHRoKCk7CmQuZmluZCgiLmEtanMtdG9vbHRpcC1hcnJvdyIpO2E9KGEraC8yKS8xMDAqYy1rLzI7aD1rK2E7KGs9aDxjKXx8KGEtPWgtYyk7Yz1hO2YoZCkuY3NzKCJsZWZ0IixjKzApO2M9ZC53aWR0aCgpO2Q9ZC5maW5kKCIuYS1qcy10b29sdGlwLWFycm93Iik7ZC5yZW1vdmVDbGFzcygiYW9rLWhpZGRlbiIpO2s/KGMvPTIsZihkKS5jc3MoImxlZnQiLGMrLTkpKTpmKGQpLmNzcygibGVmdCIsYystMjcpOzEyPmcmJmQuYWRkQ2xhc3MoImFvay1oaWRkZW4iKTtmKGIuZmluZCgiLmEtanMtcHJvZ3Jlc3MtdG9vbHRpcCIpKS5yZW1vdmVDbGFzcygiYS1wcm9ncmVzcy10b29sdGlwLWhpZGRlbiIpLmFkZENsYXNzKCJhLXByb2dyZXNzLXRvb2x0aXAtcmV2ZWFsZWQiKX19KX12YXIgZj1lLiQ7YigpO2Uub24oInJlc2l6ZSBzY3JvbGwiLGZ1bmN0aW9uKGEpe2IoKX0pO3JldHVybntpbml0OmJ9fSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGwpe3ZhciB0PXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsQj10Ll9uYW1lc3BhY2V8fHQuYXR0cmlidXRlRXJyb3JzLGI9Qj9CKCJBbWF6b25VSVBvcG92ZXJKUyIsIkFtYXpvblVJIik6dDtiLmd1YXJkRmF0YWw/Yi5ndWFyZEZhdGFsKGwpKGIsd2luZG93KTpiLmV4ZWN1dGUoZnVuY3Rpb24oKXtsKGIsd2luZG93KX0pfSkoZnVuY3Rpb24obCx0LEIpe2wud2hlbigiQSIsImEtcG9wb3Zlci1iYXNlLWZhY3RvcnkiKS5yZWdpc3RlcigiYS1wb3BvdmVyLWJhc2UtYXBpcyIsZnVuY3Rpb24oYixkKXtyZXR1cm57c2hvdzpmdW5jdGlvbihiKXt2YXIgYz1kLmdldChiLiR0cmlnZ2VyP2IuJHRyaWdnZXI6Yik7aWYoYylyZXR1cm4gYy5zaG93LmFwcGx5KGMsYXJndW1lbnRzKX0saGlkZTpmdW5jdGlvbihiKXt2YXIgYz1kLmdldChiKTtpZihjKXJldHVybiBjLnVubG9jaygxKSxjLmhpZGUuYXBwbHkoYyxhcmd1bWVudHMpfSxnZXQ6ZnVuY3Rpb24oYil7cmV0dXJuIGQuZ2V0KGIpfSwKcmVtb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiBkLnJlbW92ZShiKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIiwiYS1wb3BvdmVyLW9iamVjdGNsYXNzIiwiYS1wb3BvdmVyLWRhdGEiKS5yZWdpc3RlcigiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsZnVuY3Rpb24oYixkLGcsYyl7ZnVuY3Rpb24gayhhKXtyZXR1cm4gcFthXT9wW2FdOm51bGx9ZnVuY3Rpb24gZihhLGUpe3JldHVybiBuZXcgZy5Qb3BvdmVyQ2xhc3MoYSxlKX1mdW5jdGlvbiBhKGEsbil7dmFyIGI9bnVsbDtpZigibnVtYmVyIj09PXR5cGVvZiBhKWI9ayhhKTtlbHNlIGlmKCJzdHJpbmciPT09dHlwZW9mIGEpKGI9ZVthXT9lW2FdOm51bGwpfHwoYj1rKGEpKTtlbHNlIGlmKCJvYmplY3QiPT09dHlwZW9mIGEpaWYoYS4kcG9wb3ZlciliPWE7ZWxzZSBpZihhPWgoYSksYj1hLmRhdGEoImEtcG9wb3Zlci1pZCIpLGJ8fChiPWEuZmluZCgiLmEtZGVjbGFyYXRpdmUiKS5lcSgwKSxiPWIubGVuZ3RoPwpiLmRhdGEoImEtcG9wb3Zlci1pZCIpOm51bGwpLGI9ayhiKSwhYil7dmFyIG09YS5kYXRhKCJhY3Rpb24iKTsobT1tP2EuZGF0YShtKTpudWxsKSYmbS5uYW1lJiYoYj1tLm5hbWUsYj1lW2JdP2VbYl06bnVsbCwhYnx8biYmYi50eXBlIT09bj9iPW51bGw6KG49KG49Yi5hdHRycygiY3VycmVudERhdGFTdHJhdGVneSIpKT9jLmdldFN0cmF0ZWd5QnlOYW1lKG4pOmMuZ3Vlc3NTdHJhdGVneUJ5QXR0cnMoYi5hdHRycygpKSkmJm4ucmV1c2VQb3BvdmVyP2IuJHRyaWdnZXJbMF0hPT1hWzBdJiYoYi4kdHJpZ2dlci5kYXRhKCJhLXBvcG92ZXItaWQiLG51bGwpLGIuJHRyaWdnZXI9YSk6Yj1udWxsKX1yZXR1cm4gYn1mdW5jdGlvbiBtKCl7cXx8KHE9Zih7aWQ6LTEsJHBvcG92ZXI6diwkdHJpZ2dlcjp2LGltbWVyc2l2ZTohMH0se2lzQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGhpZGVNZXRob2Q6ZnVuY3Rpb24oKXt0aGlzLmhpZGVDaGlsZHJlbigpfSxzaG93TWV0aG9kOmIuY29uc3RhbnRzLk5PT1B9KSk7CnJldHVybiBxfXZhciBoPWIuJCxuPTEsZT17fSxwPXt9LHY9aCgiXHgzY2RpdiBpZFx4M2QnYS1wb3BvdmVyLXJvb3QnIHN0eWxlXHgzZCd6LWluZGV4Oi0xO3Bvc2l0aW9uOmFic29sdXRlOycgL1x4M2UiKS5hcHBlbmRUbygiYm9keSIpLHE7cmV0dXJue2dldFJvb3Q6bSxnZXQ6ZnVuY3Rpb24oZSxoKXtoPWg/aDp0aGlzP3RoaXMudHlwZTpudWxsO3JldHVybihlPWEoZSxoKSkmJmgmJmUudHlwZSE9PWg/bnVsbDplfSxjcmVhdGU6ZnVuY3Rpb24oYyxnKXt2YXIgZD1oKGMpLHY9Zy5hdHRyaWJ1dGVzfHx7fSxxPWcudHlwZVNwZWNpZmljRnVuY3Rpb25zfHxnLnZhcmlhbnR8fHt9O2c9Zy5hY3Rpb25DaGVja3x8ITE7ZC5kYXRhKCJhLXBvcG92ZXItaWQiKTt2YXIgbD12LnR5cGUsQT1udWxsOyFsfHxkLmhhc0NsYXNzKCJhLWRlY2xhcmF0aXZlIikmJmQuZGF0YSgiYWN0aW9uIikmJi0xIT09ZC5kYXRhKCJhY3Rpb24iKS5pbmRleE9mKGwpfHwoZD1iLmRlY2xhcmF0aXZlLmNyZWF0ZShkLAoiYS0iK2wpLGM9ZFswXSk7aWYoZyYmZC5kYXRhKCJhY3Rpb24iKSYmLTE9PT1kLmRhdGEoImFjdGlvbiIpLmluZGV4T2YobCkpcmV0dXJuIG51bGw7bCYmZCYmKEE9YShkKSk7aWYoQSlyZXR1cm4gQS50eXBlIT09bD9udWxsOkE7ZD12O2M9aChjKTsodj1kLnR5cGUpPygtMT09PWguaW5BcnJheSh2LFsibW9kYWwiLCJzZWNvbmRhcnktdmlldyIsInBvcG92ZXIiXSl8fGQucG9wb3ZlckxhYmVsfHx0LnVlTG9nRXJyb3ImJi0xIT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXS5jbGFzc05hbWUuaW5kZXhPZigiYS1hdWlfYWNjZXNzaWJpbGl0eV80OTg2MC10MSIpJiZ0LnVlTG9nRXJyb3Ioe21lc3NhZ2U6Iltwb3BvdmVyTGFiZWwgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBhbGwgQVVJIHBvcG92ZXJzLCBtb2RhbHMgYW5kIHNlY29uZGFyeSB2aWV3cyBmb3IgYWNjZXNzaWJpbGl0eSByZWFzb25zLiBQbGVhc2Ugc2VlIGh0dHA6Ly90aW55L2c4bXhvMW1rL2F1aWFtYXpkZXZlcG9wbyBmb3IgbW9yZSBkZXRhaWxzXSJ9LAp7bG9nTGV2ZWw6IkVSUk9SIn0pLGMmJmMubGVuZ3RoPyhkPWIuZXh0ZW5kKHtpZDpuKyssJHRyaWdnZXI6YywkdHJpZ2dlcldyYXBwZXI6bnVsbH0sZCkscT1iLmNvcHkocSkscT1mKGQscSkscFtxLmlkXT1xLHEubmFtZSYmKGVbcS5uYW1lXT1xKSxjLmRhdGEoImEtcG9wb3Zlci1pZCIscS5pZCksYz1xLiR0cmlnZ2VyLmNsb3Nlc3QoIi5hLXBvcG92ZXIiKSxjPSFxLmF0dHJzKCJpbW1lcnNpdmUiKSYmYy5sZW5ndGg/ayhjLmRhdGEoImEtcG9wb3Zlci1pZCIpKXx8bSgpOm0oKSxxLnBhcmVudD1jLGMuY2hpbGRyZW4ucHVzaChxKSk6cT1udWxsKTpxPW51bGw7cmV0dXJuIHF9LHJlbW92ZTpmdW5jdGlvbihhLGgpe2E9dGhpcy5nZXQoYSk7dmFyIG49ITE7aWYoYSl7bj1hLmlkO2lmKGEmJi0xPG4pe3ZhciBjPWIuaW5kZXhPZkFycmF5KGEucGFyZW50LmNoaWxkcmVuLGEpLG09YS4kY29udGFpbmVyLGc9YS4kdHJpZ2dlcjthLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoYywxKTthLnVubG9jaygpLmhpZGUoKTsKYS51cGRhdGUoe2NvbnRlbnQ6IiJ9KTttJiZhLiRjb250YWluZXIucmVtb3ZlKCk7Zy5kYXRhKCJhLXBvcG92ZXItaWQiLCIiKTthLm5hbWUmJmRlbGV0ZSBlW2EubmFtZV07ZGVsZXRlIHBbbl07bj0hMH1lbHNlIG49ITE7aCYmYi5kZWNsYXJhdGl2ZS5yZW1vdmUoYS4kdHJpZ2dlclswXSwiYS0iK2gpfXJldHVybiBufX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLXV0aWwiLCJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IikucmVnaXN0ZXIoImEtcG9wb3Zlci1iYXNlLWhhbmRsZXJzIixmdW5jdGlvbihiLGQsZyl7ZnVuY3Rpb24gYyhhKXtmb3IodmFyIGg7YS5sZW5ndGgmJiEoaD1hLmRhdGEoImEtcG9wb3Zlci1pZCIpKTspYT1hLnBhcmVudCgpO3JldHVybiBnLmdldChoKX12YXIgaz1iLiQ7ayhkb2N1bWVudCkuYmluZCgiY2xpY2sgIitiLmFjdGlvbi5zdGFydCxmdW5jdGlvbihhKXt2YXIgaD1rKGEudGFyZ2V0KSxuPWEub3JpZ2luYWxFdmVudDtpZighKG4mJgpuLnBvaW50ZXJUeXBlJiZuLnBvaW50ZXJUeXBlPT09Yi5wb2ludGVyVHlwZS50b3VjaCYmImNsaWNrIj09PW4udHlwZXx8aC5oYXNDbGFzcygiYS1tb2RhbC1zY3JvbGxlciIpfHwiYS1wb3BvdmVyLWxndGJveCI9PT1oWzBdLmlkfHwiaHRtbCI9PT1oWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXt2YXIgZT1mdW5jdGlvbihlKXtyZXR1cm4gZC5ldmVudE9jY3Vyc1dpdGhpbihhLGUpfTtiLmVhY2goZy5nZXRSb290KCkuY2hpbGRyZW4sZnVuY3Rpb24oYSl7aWYoYS5pc1Zpc2libGUoKXx8YS5pc0NvbnRlbnRMb2FkZWQoKSl7dmFyIGg9ZC5zZWFyY2goYSxlKTtoP2guaGlkZUNoaWxkcmVuKCk6bnVsbCE9PWEuYXR0cnMoImxpZ2h0Ym94T3B0aW9ucyIpfHxhLmF0dHJzKCJpbW1lcnNpdmUiKXx8YS51bmxvY2soMSkuaGlkZSgpfX0pfX0pO2IuZGVjbGFyYXRpdmUoImEtcG9wb3Zlci1jbG9zZSIsWyJjbGljayIsYi5hY3Rpb24uc3RhcnRdLGZ1bmN0aW9uKGEpe3ZhciBoPWMoYS4kdGFyZ2V0KTsKaCYmKGgudW5sb2NrKCkuaGlkZSgpLGQudHJpZ2dlcigiZGlzbWlzcyIsaCkpO2EuJGV2ZW50LnByZXZlbnREZWZhdWx0KCl9KTt2YXIgZj1udWxsLGE9bnVsbDtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXItYTExeSIsImZvY3Vzb3V0IixmdW5jdGlvbihhKXt2YXIgaD1jKGEuJHRhcmdldCk7aCYmYS4kdGFyZ2V0Lmxlbmd0aCYmaC4kZmlyc3RUYWJiYWJsZS5sZW5ndGgmJmEuJHRhcmdldFswXT09PWguJGZpcnN0VGFiYmFibGVbMF0mJiEoZiYmMTAwPmIubm93KCktZikmJihmPWIubm93KCksYi5kZWxheShmdW5jdGlvbigpe2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuaGFzQ2xhc3MoImEtcG9wb3Zlci1zdGFydCIpJiZoLiRsYXN0VGFiYmFibGUuZm9jdXMoKX0sMCkpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyLWExMXkiLCJmb2N1c2luIixmdW5jdGlvbihnKXt2YXIgaD1jKGcuJHRhcmdldCk7aCYmZy4kdGFyZ2V0Lmxlbmd0aCYmZy4kdGFyZ2V0Lmhhc0NsYXNzKCJhLXBvcG92ZXItZW5kIikmJgohKGEmJjEwMD5iLm5vdygpLWEpJiYoYT1iLm5vdygpLGIuZGVsYXkoZnVuY3Rpb24oKXtoLiRmaXJzdFRhYmJhYmxlLmZvY3VzKCl9LDApKX0pO2IuZGVjbGFyYXRpdmUoImEtcG9wb3Zlci1hMTF5Iiwia2V5ZG93biIsZnVuY3Rpb24oYSl7dmFyIGg9YS4kZXZlbnQ7aC5rZXlDb2RlPT09Yi5jb25zdGFudHMua2V5Y29kZXMuRVNDQVBFJiYoYT1jKGEuJHRhcmdldCksaC5wcmV2ZW50RGVmYXVsdCgpLGEmJmEuaGlkZSgpKX0pO2Iub24oInJlc2l6ZSB6b29tIixmdW5jdGlvbigpe2cuZ2V0Um9vdCgpLnVwZGF0ZVBvc2l0aW9uKCl9KTtpZihiLmNhcGFiaWxpdGllcy5pc1NhZmFyaSYmYi5jYXBhYmlsaXRpZXMuaW9zKWIub24oImE6cG9wb3ZlcjpyZWZyZXNoIixmdW5jdGlvbihhKXthPWEucG9wb3ZlcjthLiRwb3BvdmVyJiZhLiRwb3BvdmVyLnVuZGVsZWdhdGUoJ2lucHV0W3R5cGVceDNkImRhdGUiXScsImJsdXIiKS5kZWxlZ2F0ZSgnaW5wdXRbdHlwZVx4M2QiZGF0ZSJdJywiYmx1ciIsCmZ1bmN0aW9uKCl7dmFyIGE9Yi4kKHQpO2Euc2Nyb2xsVG9wKGEuc2Nyb2xsVG9wKCkrMSl9KX0pfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci1iYXNlLWFwaXMiLCJhLXBvcG92ZXItYmFzZS1oYW5kbGVycyIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYmFzZSIsZnVuY3Rpb24oYixkLGcpe3JldHVybiBkfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIiwiYS1wb3BvdmVyLWRhdGEiLCJhLXBvcG92ZXItcG9zaXRpb24iLCJhLXBvcG92ZXItbGlnaHRib3giLCJhLXBvcG92ZXItYW5pbWF0ZSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItb2JqZWN0Y2xhc3MiLGZ1bmN0aW9uKGIsZCxnLGMsayxmKXtmdW5jdGlvbiBhKGEsZSl7dmFyIGM9LTEsZz1bMV0sbD0tMjt0aGlzLnBhcmVudD1udWxsO3RoaXMuY2hpbGRyZW49W107dGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnM9e307dGhpcy5hdHRyaWJ1dGVzPXtwb3NpdGlvbjoidHJpZ2dlclZlcnRpY2FsIiwKYWxvbmU6ITEsaW1tZXJzaXZlOiExLHJlc3RvcmVGb2N1c09uSGlkZTohMH07dmFyIHI9ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlKCk/dGhpcy5fd2lsbFRyaWdnZXJFdmVudHMmJmQudHJpZ2dlcigidmlzaWJsZSIsdGhpcyk6ZC50cmlnZ2VyKCJpbnZpc2libGUiLHRoaXMpO3JldHVybiB0aGlzfSx0PWZ1bmN0aW9uKGEsZSl7dmFyIGM9dGhpcy5pc0FjdGl2ZSgpLGY9dGhpcy5nZXREYXRhU3RyYXRlZ3koKSxkPSF0aGlzLiRwb3BvdmVyLHA9ZXx8ZDtlPSExO2E9YXx8cDtpZighcClmb3IodmFyIGs9Zy5sZW5ndGg7ay0tJiYhcDspcD0hbltnW2tdXTtwJiYocD11LmFwcGx5KHRoaXMpLHA9aChwKSxkfHwoZi51bmxvYWRDb250ZW50KHRoaXMpLHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKSxlPSEwKSxoKCJib2R5IikuYXBwZW5kKHApLHRoaXMuJGNvbnRhaW5lcj1wLHRoaXMuJHBvcG92ZXI9dGhpcy4kY29udGFpbmVyLmhhc0NsYXNzKCJhLXBvcG92ZXIiKT90aGlzLiRjb250YWluZXI6CnRoaXMuJGNvbnRhaW5lci5maW5kKCIuYS1wb3BvdmVyIiksdGhpcy4kc3RhcnRBbmNob3I9dGhpcy4kcG9wb3Zlci5oYXNDbGFzcygiYS1wb3BvdmVyLXN0YXJ0Iik/dGhpcy4kcG9wb3Zlcjp0aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItc3RhcnQiKSx0aGlzLiRlbmRBbmNob3I9dGhpcy4kcG9wb3Zlci5maW5kKCIuYS1wb3BvdmVyLWVuZCIpLHRoaXMuJHBvcG92ZXIuYXR0cigiaWQiLCJhLXBvcG92ZXItIit0aGlzLmlkKS5kYXRhKCJhLXBvcG92ZXItaWQiLHRoaXMuaWQpKTt0aGlzLmF0dHJzKCJpbW1lcnNpdmUiKXx8KHA9cGFyc2VJbnQodGhpcy5wYXJlbnQuJHBvcG92ZXIuY3NzKCJ6LWluZGV4IiksMTApLGIuaXNGaW5pdGVOdW1iZXIocCl8fChwPXRoaXMucGFyZW50LmF0dHJzKCJpbW1lcnNpdmUiKT8xMDEwOjApLHRoaXMuJHBvcG92ZXIuY3NzKCJ6LWluZGV4IixNYXRoLm1heCgyOTksMTAwK3ApKSk7aWYoZi5zaG91bGRSZWZyZXNoQ29udGVudCh0aGlzKXx8YSllfHwKZi51bmxvYWRDb250ZW50KHRoaXMpLGYubG9hZENvbnRlbnQodGhpcyxkKTt0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy51cGRhdGVEaW1lbnNpb25zIT09bSYmdGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMudXBkYXRlRGltZW5zaW9ucy5hcHBseSh0aGlzKTtnPVtdO2MmJkMuY2FsbCh0aGlzLFtdLCExKTthPXRoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmZpbmQoImEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleFx4M2QnLTEnXSkiKTthPWEubm90KCIuYS1kcm9wZG93bi1saW5rIik7dGhpcy4kZmlyc3RUYWJiYWJsZT10aGlzLiRwb3BvdmVyLmZpbmQoJ1tkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWNsb3NlIl0nKTt0aGlzLiRmaXJzdFRhYmJhYmxlPXRoaXMuJGZpcnN0VGFiYmFibGUubGVuZ3RoP3RoaXMuJGZpcnN0VGFiYmFibGU6YS5maXJzdCgpO3RoaXMuJGxhc3RUYWJiYWJsZT0wPT09CmEubGVuZ3RoP3RoaXMuJGZpcnN0VGFiYmFibGU6YS5sYXN0KCk7cmV0dXJuIHRoaXN9LEM9ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBoKCl7Yy51cGRhdGVQb3NpdGlvbigpO3ZhciBiPWMuYXR0cnMoIm5hdmlnYXRlIik7IWUmJmImJmMuYXR0cnMoIm5hdmlnYXRlIiwhMSk7Zy5jYWxsKGMscixhKTtlJiZkLnRyaWdnZXIoInNob3ciLGMpO3AmJnAuYXBwbHkoYyxhKTtlJiZkLnRyaWdnZXIoImFmdGVyU2hvdyIsYyk7Yy4kcG9wb3Zlci5hdHRyKCJhcmlhLWhpZGRlbiIsImZhbHNlIik7IWUmJmImJmMuYXR0cnMoIm5hdmlnYXRlIixiKTtsPTJ9dmFyIGM9dGhpcztlPSEhZTt2YXIgbj1jLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucyxnPW4uc2hvd01ldGhvZCE9PW0/bi5zaG93TWV0aG9kOnYsZj1uLmJlZm9yZVNob3dNZXRob2QhPT1tP24uYmVmb3JlU2hvd01ldGhvZDpudWxsLHA9bi5hZnRlclNob3dNZXRob2QhPT1tP24uYWZ0ZXJTaG93TWV0aG9kOm51bGw7bD0xO2MuX3dpbGxUcmlnZ2VyRXZlbnRzPQplO2MuYXR0cnMoIm9yaWdpbmFsRm9jdXMiLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO2MuJHBvcG92ZXIuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuYWRkQ2xhc3MoImEtcG9wb3Zlci1oaWRkZW4iKS5zaG93KCk7ZiYmZi5hcHBseShjLGEpO2MuYXR0cnMoInN5bmNocm9ub3VzIik/aCgpOmIuZGVsYXkoZnVuY3Rpb24oKXtoKCl9LDApfTt0aGlzLnNob3c9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGU9YS5hdHRycygibGlnaHRib3hPcHRpb25zIil8fG51bGw7aWYoYS5pc0FjdGl2ZSgpfHxmLmlzQW5pbWF0aW5nKGEpKXJldHVybiB0aGlzO2EubG9jaygxKTtlJiZrLmxvY2soMSk7YS5hdHRycygiYWxvbmUiKSYmYi5lYWNoKGEucGFyZW50LmNoaWxkcmVuLGZ1bmN0aW9uKGUpe2UuaXNBY3RpdmUoKSYmZS5pZCE9PWEuaWQmJiFlLmF0dHJzKCJtb2RlbGVzcyIpJiZlLnVubG9jaygpLmhpZGUoKX0pO2QudHJpZ2dlcigiYmVmb3JlU2hvdyIsYSk7aWYoIWEuJGNvbnRhaW5lcnx8YS5pc0RpcnR5KCl8fAphLmdldERhdGFTdHJhdGVneSgpLnNob3VsZFJlZnJlc2hDb250ZW50KGEpKWQudHJpZ2dlcigicmVmcmVzaCIsYSksdC5jYWxsKGEpO2lmKGEuZHJhZ2dhYmxlKXt2YXIgaD1hLiRjb250YWluZXI7Yi5kcmFnZ2FibGUoaCx7aGFuZGxlOmguZmluZCgiLmEtcG9wb3Zlci1kcmFnZ2FibGUtaGFuZGxlIil9KX1lJiZrLnNob3coYi5leHRlbmQoe3BvcG92ZXI6YX0sZSkpO0MuY2FsbChhLGFyZ3VtZW50cywhMCk7Yi5kZWxheShmdW5jdGlvbigpe2EudW5sb2NrKDEpO2UmJmsudW5sb2NrKDEpfSwwKTtyZXR1cm4gdGhpc307dGhpcy5oaWRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxlPWEudHlwZVNwZWNpZmljRnVuY3Rpb25zLGM9ZS5oaWRlTWV0aG9kIT09bT9lLmhpZGVNZXRob2Q6cSxuPWUuYmVmb3JlSGlkZU1ldGhvZCE9PW0/ZS5iZWZvcmVIaWRlTWV0aG9kOm51bGwsZz1lLmFmdGVySGlkZU1ldGhvZCE9PW0/ZS5hZnRlckhpZGVNZXRob2Q6bnVsbCx2PWEuYXR0cnMoImxpZ2h0Ym94T3B0aW9ucyIpfHwKbnVsbDtpZighYS5pc0FjdGl2ZSgpfHxhLmlzTG9ja2VkKCl8fGYuaXNBbmltYXRpbmcoYSkpcmV0dXJuIHRoaXM7bD0tMTthLmhpZGVDaGlsZHJlbigpO2QudHJpZ2dlcigiYmVmb3JlSGlkZSIsYSk7biYmbi5hcHBseShhLGFyZ3VtZW50cyk7Yy5jYWxsKGEscixhcmd1bWVudHMpO2QudHJpZ2dlcigiaGlkZSIsYSk7Yi5kZWxheShmdW5jdGlvbigpe2cmJmcuYXBwbHkoYSxhcmd1bWVudHMpO2EuJHBvcG92ZXIuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIik7diYmKGEucGFyZW50LmF0dHJzKCJsaWdodGJveE9wdGlvbnMiKT9rLnNob3coYi5leHRlbmQoe3BvcG92ZXI6YS5wYXJlbnR9LHYpKTprLmhpZGUodikpO2QudHJpZ2dlcigiYWZ0ZXJIaWRlIixhKTtsPS0yO2lmKGEuYXR0cnMoInJlc3RvcmVGb2N1c09uSGlkZSIpKXt2YXIgZT1udWxsOyJkcm9wZG93biI9PT1hLnR5cGU/ZT1hLnNvdXJjZUJ1dHRvbi5maW5kKCJbYXJpYS1wcmVzc2VkXSIpOmEuJHRyaWdnZXImJmgoYS4kdHJpZ2dlcikubGVuZ3RoJiYKKGU9YS4kdHJpZ2dlci5pcygiYSwgaW5wdXQsIGJ1dHRvbiIpP2EuJHRyaWdnZXI6YS4kdHJpZ2dlci5maW5kKCJhLCBpbnB1dCwgYnV0dG9uIikpO2UmJmUubGVuZ3RofHwoZT1oKGEuYXR0cnMoIm9yaWdpbmFsRm9jdXMiKSkpOyFlLmxlbmd0aHx8cCYmIWUuaXMoIjp2aXNpYmxlIil8fGIuZGVsYXkoZnVuY3Rpb24oKXtlLmZvY3VzKCl9LDQwMCl9fSwwKTtyZXR1cm4gdGhpc307dGhpcy51cGRhdGU9ZnVuY3Rpb24oYSl7dmFyIGU9InN0cmluZyI9PT10eXBlb2YgYT97Y29udGVudDphfTpiLmNvcHkoYSksaD10aGlzLmF0dHJzKCk7YT10aGlzLmdldERhdGFTdHJhdGVneSgpO2IuZWFjaChlLGZ1bmN0aW9uKGEsZSl7KGEmJiFoW2VdfHxoW2VdJiZoW2VdIT09YSkmJmcucHVzaChlKX0pO3RoaXMuaXNEaXJ0eSgpJiYoZT1iLmV4dGVuZCh7fSxoLGUpLHRoaXMuYXR0cnMoZSksdGhpcy5nZXREYXRhU3RyYXRlZ3koZSksdGhpcy4kcG9wb3ZlciYmYS51bmxvYWRDb250ZW50KHRoaXMpLAp0aGlzLmlzQWN0aXZlKCkmJih0LmNhbGwodGhpcywhMCksdGhpcy5mb2N1cygpKSk7cmV0dXJuIHRoaXN9O3RoaXMucmVmcmVzaD1mdW5jdGlvbihhLGUpe3JldHVybiB0LmNhbGwodGhpcyxhfHwhMCxlfHwhMSl9O3RoaXMuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gMTw9bH07dGhpcy5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gMj09PWx9O3RoaXMuaXNDb250ZW50TG9hZGluZz1mdW5jdGlvbigpe3JldHVybiAzPT09bH07dGhpcy5zZXRDb250ZW50TG9hZGluZz1mdW5jdGlvbigpe2w9M307dGhpcy5pc0NvbnRlbnRMb2FkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gND09PWx9O3RoaXMuc2V0Q29udGVudExvYWRlZD1mdW5jdGlvbigpe2w9NH07dGhpcy5pc0RpcnR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA8Zy5sZW5ndGh9O3RoaXMubG9jaz1mdW5jdGlvbihhKXthfHwoYT0xMCk7YzxhJiYoYz1hKTtyZXR1cm4gdGhpc307dGhpcy51bmxvY2s9ZnVuY3Rpb24oYSl7YXx8KGE9MTApOwpjPD1hJiYoYz0tMSk7cmV0dXJuIHRoaXN9O3RoaXMuaXNMb2NrZWQ9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PWN9O3RoaXMudHlwZVNwZWNpZmljRnVuY3Rpb25zPWU7dGhpcy5hdHRycyhhKTtiLmV4dGVuZCh0aGlzLHRoaXMuYXR0cmlidXRlcyl9dmFyIG0saD1iLiQsbj17bmFtZTohMCx1cmw6ITAsY29udGVudDohMCx3aWR0aDohMCxoZWlnaHQ6ITAsIm1heC13aWR0aCI6ITAsIm1heC1oZWlnaHQiOiEwLCJtaW4td2lkdGgiOiEwLCJtaW4taGVpZ2h0IjohMH0sZT1iLmNhcGFiaWxpdGllcy5tb2JpbGUmJmIuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXMscD1oKCJodG1sIikuaGFzQ2xhc3MoImEtbHQtaWU5Iiksdj1mdW5jdGlvbihhKXt0aGlzLiRwb3BvdmVyLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KS5yZW1vdmVDbGFzcygiYS1wb3BvdmVyLWhpZGRlbiIpO3RoaXMuYXR0cnMoImZvY3VzV2hlblNob3duIikmJiJhamF4IiE9PXRoaXMuYXR0cnMoImN1cnJlbnREYXRhU3RyYXRlZ3kiKSYmCnRoaXMuZm9jdXMoKTthLmNhbGwodGhpcyl9LHE9ZnVuY3Rpb24oYSl7dGhpcy4kcG9wb3Zlci5oaWRlKCkuZmluZCgiLmEtbGd0Ym94LXZlcnRpY2FsLXNjcm9sbCIpLnJlbW92ZUNsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKTthLmNhbGwodGhpcyl9LHU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucztyZXR1cm4gYS5za2luIT09bT9hLnNraW4odGhpcyk6IiJ9LGw9YS5wcm90b3R5cGU7bC5nZXREYXRhU3RyYXRlZ3k9ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnM7YXx8dGhpcy5hdHRycygiY3VycmVudERhdGFTdHJhdGVneSIpfHwoYT10aGlzLmF0dHJzKCkpO2EmJihhPWEuZGF0YVN0cmF0ZWd5P2cuZ2V0U3RyYXRlZ3lCeU5hbWUoYS5kYXRhU3RyYXRlZ3kpOmcuZ3Vlc3NTdHJhdGVneUJ5QXR0cnMoYSkpJiYoZS5kYXRhU3RyYXRlZ3k9YSx0aGlzLmF0dHJzKCJjdXJyZW50RGF0YVN0cmF0ZWd5IixhLm5hbWUpKTsKcmV0dXJuIGUuZGF0YVN0cmF0ZWd5fTtsLmdldENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMuZ2V0Q29udGVudCE9PW0/dGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMuZ2V0Q29udGVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bnVsbH07bC51cGRhdGVDb250ZW50PWZ1bmN0aW9uKGEpe3RoaXMudHlwZVNwZWNpZmljRnVuY3Rpb25zLnVwZGF0ZUNvbnRlbnQhPT1tJiZ0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy51cGRhdGVDb250ZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc307bC5zZXRBcmlhQnVzeT1mdW5jdGlvbihhKXt0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy5zZXRBcmlhQnVzeSE9PW0mJnRoaXMudHlwZVNwZWNpZmljRnVuY3Rpb25zLnNldEFyaWFCdXN5LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc307bC5hamF4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVwZGF0ZSh7dXJsOmF9KX07CmwudXBkYXRlQ2hpbGRyZW5Qb3NpdGlvbj1mdW5jdGlvbigpe2IuZWFjaCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKGEpe2EuaXNBY3RpdmUoKSYmYS51cGRhdGVQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O2wudXBkYXRlUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2lmKC0xPT09YS5pZCliLmVhY2goYS5jaGlsZHJlbixmdW5jdGlvbihhKXthLmlzQWN0aXZlKCkmJmEudXBkYXRlUG9zaXRpb24oKX0pO2Vsc2V7aWYodGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMudXBkYXRlUG9zaXRpb24hPT1tKXJldHVybiB0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy51cGRhdGVQb3NpdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYTt2YXIgZT1hLiRwb3BvdmVyO2IuY2FwYWJpbGl0aWVzLmlzTWV0cm9JRUd1ZXNzJiZiLmNhcGFiaWxpdGllcy5pc0lFVG91Y2hDYXBhYmxlP2UuY3NzKCJvcGFjaXR5IiwuMDEpOmUuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgbj0KZS5maW5kKCIuYS1wb3BvdmVyLWlubmVyIikuY3NzKHtoZWlnaHQ6ImF1dG8iLCJvdmVyZmxvdy15IjoiYXV0byJ9KSxnPWEuYXR0cnMoInBvc2l0aW9uIiksZj17fSxmPWEudHlwZVNwZWNpZmljRnVuY3Rpb25zLnBvc2l0aW9uU3RyYXRlZ3k/Yy5jdXN0b21Qb3NpdGlvbihhLGEudHlwZVNwZWNpZmljRnVuY3Rpb25zLnBvc2l0aW9uU3RyYXRlZ3kpOmNbZ10oYSk7ZC50cmlnZ2VyKCJiZWZvcmVVcGRhdGVQb3NpdGlvbiIsYSk7Zz17dG9wOmYudG9wKyJweCIsbGVmdDpmLmxlZnQrInB4In07Yi5jYXBhYmlsaXRpZXMuaXNNZXRyb0lFR3Vlc3MmJmIuY2FwYWJpbGl0aWVzLmlzSUVUb3VjaENhcGFibGU/Zy5vcGFjaXR5PTE6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIjtlLmNzcyhnKTthLmlzQ29udGVudExvYWRlZCgpJiYwPT09aChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KGEuJHBvcG92ZXIpLmxlbmd0aCYmITA9PT1hLmF0dHJzKCJmb2N1c1doZW5TaG93biIpJiZhLmZvY3VzKCk7CmlmKG4ubGVuZ3RoJiYoIW5bMF0uc3R5bGUuaGVpZ2h0fHwiYXV0byI9PT1uWzBdLnN0eWxlLmhlaWdodCkpe3ZhciBmPWUub3V0ZXJIZWlnaHQoKXx8MCxtPWUuZmluZCgiLmEtcG9wb3Zlci1oZWFkZXIsIC5hLW1vZGFsLWNsb3NlLW5vaGVhZC10b3AiKS5vdXRlckhlaWdodCghMCl8fDAscD1lLmZpbmQoIi5hLXBvcG92ZXItZm9vdGVyIikub3V0ZXJIZWlnaHQoITApfHwwLGc9bi5vdXRlckhlaWdodCgpfHwwLGY9Zi1tLXA7Zz5mJiZuLmNzcyh7aGVpZ2h0OmYrInB4Iiwib3ZlcmZsb3cteSI6InNjcm9sbCJ9KX1kLnRyaWdnZXIoImFmdGVyVXBkYXRlUG9zaXRpb24iLGEpO2QudHJpZ2dlcigicG9zaXRpb25VcGRhdGVkIixhKTtiLmVhY2goYS5jaGlsZHJlbixmdW5jdGlvbihhKXthLmlzQWN0aXZlKCkmJmEudXBkYXRlUG9zaXRpb24oKX0pfTthLmF0dHJzKCJpbW1lcnNpdmUiKSYmKGIuY2FwYWJpbGl0aWVzLm1vYmlsZXx8Yi5jYXBhYmlsaXRpZXMudGFibGV0KT8oZS5jc3Moe3RvcDowLApsZWZ0OjB9KSxiLmRlbGF5KGZ1bmN0aW9uKCl7bigpfSwwKSk6bigpfXJldHVybiBhfTtsLmF0dHJzPWZ1bmN0aW9uKGEsZSl7dmFyIGg9dGhpcztpZihlPT09bSYmIm9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gYT8ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYXR0cmlidXRlc1thXSE9PW0/dGhpcy5hdHRyaWJ1dGVzW2FdOm51bGw6bnVsbDp0aGlzLmF0dHJpYnV0ZXM7Im9iamVjdCI9PT10eXBlb2YgYT9iLmVhY2goYSxmdW5jdGlvbihhLGUpe2guYXR0cnMoZSxhKX0pOiJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmF0dHJpYnV0ZXNbYV09ZSxoW2FdPWUpO3JldHVybiB0aGlzfTtsLmhpZGVDaGlsZHJlbj1mdW5jdGlvbigpe2IuZWFjaCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKGEpe2EudW5sb2NrKDEpO2EuaGlkZSgpfSk7cmV0dXJuIHRoaXN9O2wuZm9jdXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9aCh0KSxuPWMuc2Nyb2xsVG9wKCksZz1hLiRwb3BvdmVyLm9mZnNldCgpLnRvcDsKZSYmbj5nJiZjLnNjcm9sbFRvcChnKTtiLmRlbGF5KGZ1bmN0aW9uKCl7YS4kc3RhcnRBbmNob3IuZm9jdXMoKX0sMCk7cmV0dXJuIHRoaXN9O3JldHVybntQb3BvdmVyQ2xhc3M6YX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJqUXVlcnkiLCJyZWFkeSIpLnJlZ2lzdGVyKCJhLWNoYW5nZW92ZXIiLGZ1bmN0aW9uKGIpe2IoZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1jaGFuZ2VvdmVyOm5vdCguYS1jaGFuZ2VvdmVyLW1hbnVhbCkiLCJ3ZWJraXRBbmltYXRpb25FbmQgYW5pbWF0aW9uZW5kIGNsaWNrIHRvdWNoc3RhcnQiLGZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItdXRpbCIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYWpheC1zdHJhdGVneSIsZnVuY3Rpb24oYixkKXtyZXR1cm57bmFtZToiYWpheCIscmV1c2VQb3BvdmVyOiExLGxvYWRDb250ZW50OmZ1bmN0aW9uKGcsYyl7Zy5zZXRDb250ZW50TG9hZGluZygpOwp2YXIgaz1nLmF0dHJzKCJ1cmwiKSxmPWcuYXR0cnMoInRpbWVvdXQiKXx8MUU0LGE9Zy5hdHRycygiYWpheEZhaWxNc2ciKXx8IlNvcnJ5LCBjb250ZW50IGlzIG5vdCBhdmFpbGFibGUuIixtPSEhZy5hdHRycygiY2FjaGUiKSxoPWcuYXR0cnMoInNwaW5uZXJUaW1lciIpLG49Zy5hdHRycygiYWpheEhhbmRsZXIiKSxlPWcuYXR0cnMoImNvbnRlbnQiKTtnLmF0dHJzKCJjb250ZW50IixudWxsKTtpZihlJiYhYylnLnVwZGF0ZUNvbnRlbnQoZSksaCYmY2xlYXJUaW1lb3V0KGgpLG4mJm4uYWJvcnQmJm4uYWJvcnQoKTtlbHNle3ZhciBwPWZ1bmN0aW9uKCl7cmV0dXJuIWcuYXR0cnMoImNvbnRlbnQiKSYmImFqYXgiPT09Zy5hdHRycygiY3VycmVudERhdGFTdHJhdGVneSIpJiYoZy5pc1Zpc2libGUoKXx8Zy5pc0FjdGl2ZSgpKX0saD1iLmRlbGF5KGZ1bmN0aW9uKCl7cCgpJiYoZC5zaG93U3Bpbm5lcihnKSxnLnNldEFyaWFCdXN5KCEwKSl9LDEwMCksdj1mdW5jdGlvbihhLGUsYyl7cCgpJiYKKGNsZWFyVGltZW91dChoKSxnLnNldENvbnRlbnRMb2FkZWQoKSxkLnRyaWdnZXIoZSxnKSxnLnNldEFyaWFCdXN5KCExKSxnLnVwZGF0ZSh7Y29udGVudDphfSksZy5pc0FjdGl2ZSgpJiZnLnVwZGF0ZVBvc2l0aW9uKCksYyYmZC50cmlnZ2VyKCJhamF4Q29udGVudExvYWRlZCIsZykpfSxuPWIuYWpheChrLHt0eXBlOiJHRVQiLHRpbWVvdXQ6ZixjYWNoZTptLHN1Y2Nlc3M6ZnVuY3Rpb24oYSl7dihhLCJhamF4U3VjY2VzcyIsITApfSxlcnJvcjpmdW5jdGlvbigpe3YoYSwiYWpheEZhaWwiLCExKX19KTtnLmF0dHJzKHtzcGlubmVyVGltZXI6aCxhamF4SGFuZGxlcjpufSl9cmV0dXJuIHRoaXN9LHVubG9hZENvbnRlbnQ6ZnVuY3Rpb24oYil7ZC5jbGVhckNvbnRlbnQoYik7cmV0dXJuIHRoaXN9LHNob3VsZFJlZnJlc2hDb250ZW50OmZ1bmN0aW9uKGIpe3JldHVybiFiLmF0dHJzKCJtYW51YWxSZWZyZXNoIil9LGlzVmFsaWRTdHJhdGVneTpmdW5jdGlvbihiKXtyZXR1cm4hIWIudXJsfX19KTsKInVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIikucmVnaXN0ZXIoImEtcG9wb3Zlci1pbmxpbmUtc3RyYXRlZ3kiLGZ1bmN0aW9uKGIsZCl7cmV0dXJue25hbWU6ImlubGluZSIscmV1c2VQb3BvdmVyOiExLGxvYWRDb250ZW50OmZ1bmN0aW9uKGIpe2Iuc2V0Q29udGVudExvYWRpbmcoKTt2YXIgYz1iLmF0dHJzKCJjb250ZW50Iik7YyYmYi5hdHRycygiY29udGVudCIsbnVsbCk7aWYoIWMpdmFyIGM9Yi4kdHJpZ2dlcixkPWMuZGF0YSgiYWN0aW9uIiksYz1jLmRhdGEoZCl8fHt9LGM9Yy5pbmxpbmVDb250ZW50P2MuaW5saW5lQ29udGVudDpudWxsO2N8fChjPWIuYXR0cnMoImlubGluZUNvbnRlbnQiKSk7Yi51cGRhdGVDb250ZW50KGMpO2Iuc2V0Q29udGVudExvYWRlZCgpO3JldHVybiB0aGlzfSx1bmxvYWRDb250ZW50OmZ1bmN0aW9uKGIpe3ZhciBjPWIuZ2V0Q29udGVudCgpLGM9YyYmMDxjLmxlbmd0aD9jLmh0bWwoKTpiLmF0dHJzKCJpbmxpbmVDb250ZW50IiksCms9Yi4kdHJpZ2dlcixmPWsuZGF0YSgiYWN0aW9uIiksYT1rLmRhdGEoZil8fHt9O2EuaW5saW5lQ29udGVudD1jO2suZGF0YShmLGEpO2QuY2xlYXJDb250ZW50KGIpO3JldHVybiB0aGlzfSxzaG91bGRSZWZyZXNoQ29udGVudDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0RpcnR5KCl9LGlzVmFsaWRTdHJhdGVneTpmdW5jdGlvbihiKXtyZXR1cm4hMH19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIikucmVnaXN0ZXIoImEtcG9wb3Zlci1wcmVsb2FkLXN0cmF0ZWd5IixmdW5jdGlvbihiLGQpe3ZhciBnPWIuJDtyZXR1cm57bmFtZToicHJlbG9hZCIscmV1c2VQb3BvdmVyOiEwLGxvYWRDb250ZW50OmZ1bmN0aW9uKGIpe2Iuc2V0Q29udGVudExvYWRpbmcoKTt2YXIgZD1iLmF0dHJzKCJuYW1lIiksZj1iLmF0dHJzKCJjb250ZW50Iik7Yi5hdHRycygiY29udGVudCIsbnVsbCk7dmFyIGE7YT1nKCIjYS1wb3BvdmVyLSIrZCk7YS5kZXRhY2goKTtpZihhLmxlbmd0aCl7YT0KYVswXTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuZmlyc3RDaGlsZDspbS5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpO2E9bX1lbHNlIGE9ITE7Zj9iLnVwZGF0ZUNvbnRlbnQoZik6ZCYmYi51cGRhdGVDb250ZW50KGEpO2Iuc2V0Q29udGVudExvYWRlZCgpO3JldHVybiB0aGlzfSx1bmxvYWRDb250ZW50OmZ1bmN0aW9uKGMpe3ZhciBrPWMuYXR0cnMoIm5hbWUiKTtpZihrKXt2YXIgZj1jLmdldENvbnRlbnQoKTtpZihmJiZmLmh0bWwoKSl7dmFyIGs9ImEtcG9wb3Zlci0iK2ssYT1nKCIjIitrKTthLmxlbmd0aD9hPWFbMF06KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5pZD1rLGEuY2xhc3NOYW1lPSJhLXBvcG92ZXItcHJlbG9hZCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKSk7az1hO2lmKCFiLnRyaW0oay5pbm5lckhUTUwpKWlmKGY9ZlswXSwic3RyaW5nIj09PXR5cGVvZiBmKWcoaykuaHRtbChmKTtlbHNle2ZvcihhPQpkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zi5maXJzdENoaWxkOylhLmFwcGVuZENoaWxkKGYuZmlyc3RDaGlsZCk7ay5hcHBlbmRDaGlsZChhKX1kLmNsZWFyQ29udGVudChjKX19cmV0dXJuIHRoaXN9LHNob3VsZFJlZnJlc2hDb250ZW50OmZ1bmN0aW9uKGIpe2I9KGI9Yi5hdHRycygibmFtZSIpKT9nKCIjYS1wb3BvdmVyLSIrYik6bnVsbDtyZXR1cm4hKCFifHwhYi5sZW5ndGh8fCIiPT09Yi5odG1sKCkpfSxpc1ZhbGlkU3RyYXRlZ3k6ZnVuY3Rpb24oYil7cmV0dXJuIGIubmFtZT8icHJlbG9hZCI9PT1iLmN1cnJlbnREYXRhU3RyYXRlZ3k/ITA6ISFnKCIjYS1wb3BvdmVyLSIrYi5uYW1lKS5sZW5ndGg6ITF9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1iYXNlLXBvc2l0aW9ucyIsZnVuY3Rpb24oYil7cmV0dXJue3Bvc2l0aW9uU3RyYXRlZ3k6ZnVuY3Rpb24oZCl7dmFyIGc9ZC4kcG9wb3ZlcixjPWQuJHRyaWdnZXIsCms9ZC5tZWFzdXJlO2Q9Zy5maW5kKCIuYS1wb3BvdmVyLWlubmVyIik7ZC5jc3MoeyJtaW4td2lkdGgiOiIwcHgiLHdpZHRoOiJhdXRvIixoZWlnaHQ6ImF1dG8ifSk7dmFyIGY9Yy5jbG9zZXN0KCIuYS1idXR0b24tZHJvcGRvd24iKTtmLmxlbmd0aHx8KGY9Yy5jbG9zZXN0KCIuYS1idXR0b24tZ3JvdXAiKSk7dmFyIGM9ayhnLGYpLGs9Yy53aW5kb3dXaWR0aC0oYy50cmlnZ2VyTGVmdCtjLnBvcG92ZXJXaWR0aCksZj1jLndpbmRvd1dpZHRoLWMudHJpZ2dlckxlZnQtYy50cmlnZ2VyV2lkdGgsYT1jLnRyaWdnZXJMZWZ0LG09e30saD1jLnRyaWdnZXJUb3AtYy53aW5kb3dUb3Asbj1jLndpbmRvd0JvdHRvbS1jLnRyaWdnZXJCb3R0b20sZT1nLmZpbmQoIi5hLXBvcG92ZXItaW5uZXIiKTtoPm4mJm48Yy5wb3BvdmVySGVpZ2h0PyhuPWgsbS50b3A9aDxjLnBvcG92ZXJIZWlnaHQ/Yy50cmlnZ2VyQm90dG9tLWg6Yy50cmlnZ2VyQm90dG9tLWMucG9wb3ZlckhlaWdodCk6bS50b3A9Yy50cmlnZ2VyVG9wOwplLmNzcygiaGVpZ2h0IixuPGMucG9wb3ZlckhlaWdodD9uLWMuaGVhZGVySGVpZ2h0KyJweCI6ImF1dG8iKTtjLnBvcG92ZXJIZWlnaHQ+bj9lLmFkZENsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKTplLnJlbW92ZUNsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKTtkLmhhc0NsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKSYmLTE8bmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZigiV2luZG93cyIpPyhoPU1hdGgubWF4KGMucG9wb3ZlcldpZHRoLGMudHJpZ2dlcldpZHRoKStiLnNjcm9sbEJhcldpZHRoKCEwKSxkLndpZHRoKGgpKTpkLmNzcygibWluLXdpZHRoIixjLnRyaWdnZXJXaWR0aCsicHgiKTtjLnBvcG92ZXJXaWR0aD1nLndpZHRoKCk7bS5sZWZ0PTUwPmsmJmE+Zj9jLnRyaWdnZXJSaWdodC1jLnBvcG92ZXJXaWR0aDpjLnRyaWdnZXJMZWZ0O3JldHVybiBtfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1kcm9wZG93bi1iYXNlLXBvc2l0aW9ucyIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLWJhc2Utdmlldy1iYXNlIiwKZnVuY3Rpb24oYixkKXtyZXR1cm4gYi5leHRlbmQoZCx7dXBkYXRlQ29udGVudDpmdW5jdGlvbihiKXsic3RyaW5nIj09PXR5cGVvZiBiP3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmh0bWwoYik6YiYmdGhpcy4kcG9wb3Zlci5maW5kKCIuYS1wb3BvdmVyLWlubmVyIikuaHRtbCgiIikuYXBwZW5kKGIpfSxiZWZvcmVTaG93TWV0aG9kOmZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQubG9jaygxKTt0aGlzLiR0cmlnZ2VyLmF0dHIoImFyaWEtcHJlc3NlZCIsITApfSxhZnRlclNob3dNZXRob2Q6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLiRwb3BvdmVyLGM9Zy5maW5kKCIuYS1hY3RpdmUiKTtiLmRlbGF5KGZ1bmN0aW9uKCl7Yy5sZW5ndGg/Yy5jbG9zZXN0KCJsaSIpLmZvY3VzKCk6Yz1nLmZpbmQoImxpIikuZmlyc3QoKS5mb2N1cygpfSwwKX0sYmVmb3JlSGlkZU1ldGhvZDpmdW5jdGlvbigpe3RoaXMucGFyZW50LnVubG9jaygxKX0sYWZ0ZXJIaWRlTWV0aG9kOmZ1bmN0aW9uKCl7dGhpcy4kdHJpZ2dlci5hdHRyKCJhcmlhLXByZXNzZWQiLAohMSk7dGhpcy4kcG9wb3Zlci5jc3MoIndpZHRoIiwiYXV0byIpfX0pfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZS12aWV3LWJhc2UiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1iYXNlLXZpZXciLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsImEtZHJvcGRvd24tYmFzZS12aWV3IikucmVnaXN0ZXIoImEtZHJvcGRvd24tYmFzZS1mYWN0b3J5IixmdW5jdGlvbihiLGQsZyl7ZnVuY3Rpb24gYyhoLG4sZSl7dmFyIGM9WydceDNjbGkgdGFiaW5kZXhceDNkIjAiIHJvbGVceDNkIm9wdGlvbiInXSxmPWguZGF0YSgiYUNzc0NsYXNzIiksZz1oLmRhdGEoImFJZCIpLG09aC5kYXRhKCJhSHRtbENvbnRlbnQiKSxkPWguZGF0YSgiYUltYWdlU291cmNlIiksaz1KU09OLnN0cmluZ2lmeSh7c3RyaW5nVmFsOmgudmFsKCl9KSxrPVsnXHgzY2EgdGFiaW5kZXhceDNkIi0xIiBocmVmXHgzZCJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtdmFsdWVceDNkIicsCmIuZXNjYXBlSHRtbChrKSwnIiddLGw9WyJhLWRyb3Bkb3duLWxpbmsiXSx0PVsiYS1kcm9wZG93bi1pdGVtIl07biYmKGwucHVzaCgiYS1hY3RpdmUiKSxjLnB1c2goJyBhcmlhLWNoZWNrZWRceDNkInRydWUiJykpO2EmJihiLmNhcGFiaWxpdGllcy5tb2JpbGV8fGIuY2FwYWJpbGl0aWVzLnRhYmxldCkmJmwucHVzaCgiYS1saXN0LWxpbmstYWZ0ZXItZ3JvdXAiKTthPSExO2YmJnQucHVzaChmKTtnJiZjLnB1c2goJyBpZFx4M2QiJytnKyciJyk7Yy5wdXNoKCdhcmlhLWxhYmVsbGVkYnlceDNkIicpO2MucHVzaChlKTtjLnB1c2goJyInKTtrLnB1c2goJyBpZFx4M2QiJyk7ay5wdXNoKGUpO2sucHVzaCgnIicpO2MucHVzaCgnIGNsYXNzXHgzZCInK3Quam9pbigiICIpKyciJyk7Yy5wdXNoKCJceDNlIik7bT9uPW06KG49W10sZCYmKGwucHVzaCgiYS1vcHRpb24taGFzLWltYWdlIiksbi5wdXNoKCdceDNjaW1nIHNyY1x4M2QiJytkKyciIGNsYXNzXHgzZCJhLXJpY2gtb3B0aW9uLWltYWdlIiAvXHgzZScpKSwKbi5wdXNoKGguaHRtbCgpKSxuPW4uam9pbigiIikpO2sucHVzaCgnIGNsYXNzXHgzZCInKTtrLnB1c2gobC5qb2luKCIgIikpO2sucHVzaCgnIlx4M2UnKTtrLnB1c2gobik7ay5wdXNoKCJceDNjL2FceDNlIik7Yy5wdXNoKGsuam9pbigiIikpO2MucHVzaCgiXHgzYy9saVx4M2UiKTtyZXR1cm4gYy5qb2luKCIiKX1mdW5jdGlvbiBrKGIpe2IuanF1ZXJ5fHwoYj1mKGIpKTt2YXIgbj1iLmNoaWxkcmVuKCJvcHRncm91cCxvcHRpb246bm90KC5hLXByb21wdCkiKSxlPSExLGc9YlswXSxkPWIuYXR0cigiaWQiKT9iLmF0dHIoImlkIik6ImRyb3Bkb3duIittKyssayxsOy0xPGcuc2VsZWN0ZWRJbmRleCYmKGs9Zy5vcHRpb25zW2cuc2VsZWN0ZWRJbmRleF0udmFsdWUpO2w9WydceDNjdWwgdGFiaW5kZXhceDNkIi0xIiBjbGFzc1x4M2QiYS1ub3N0eWxlIGEtbGlzdC1saW5rJyxiLmRhdGEoImEtaGFzLWltYWdlcyIpPyIgYS1ib3gtbGlzdCI6IiIsJyIgcm9sZVx4M2QiYXBwbGljYXRpb24iIGFyaWEtbXVsdGlzZWxlY3RhYmxlXHgzZCJmYWxzZSJceDNlJ107CnZhciByPTA7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKTtiLmlzKCJvcHRncm91cCIpPyhiLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbihhKXtsLnB1c2goYyhmKHRoaXMpLGs9PT10aGlzLnZhbHVlLGQrIl8iK3IrKykpfSksbC5wdXNoKCdceDNjbGkgdGFiaW5kZXhceDNkIi0xIiBjbGFzc1x4M2QiZGl2aWRlciJceDNlXHgzY2hyIC9ceDNlXHgzYy9saVx4M2UnKSxlPWE9ITApOihsLnB1c2goYyhiLGs9PT10aGlzLnZhbHVlLGQrIl8iK3IrKykpLGU9ITEpfSk7ZSYmbC5wb3AoKTtsLnB1c2goIlx4M2MvdWxceDNlIik7cmV0dXJuIGwuam9pbigiIil9dmFyIGY9Yi4kLGE9ITEsbT0xO3JldHVybiBiLmV4dGVuZCh7Y3JlYXRlOmQuY3JlYXRlLHJlbW92ZTpkLnJlbW92ZSxnZXQ6ZC5nZXR9LHt0eXBlOiJkcm9wZG93biIsY3JlYXRlOmZ1bmN0aW9uKGEsbixlKXt2YXIgYz1uLiRidXR0b24sZj1uLiRzb3VyY2VTZWxlY3QsbT1mWzBdLGw9Yy5maW5kKCIuYS1kcm9wZG93bi1sYWJlbCIpLApyPWYuZGF0YSgiYVRvdWNoSGVhZGVyIik7aWYoIXJ8fCFyLmxlbmd0aCYmbC5sZW5ndGgpcj1sLnRleHQoKTtyZXR1cm4gZC5jcmVhdGUoYSx7YXR0cmlidXRlczp7dHlwZToiZHJvcGRvd24iLGhlYWRlcjpyLGNsb3NlQnV0dG9uTGFiZWw6bi5jbG9zZUJ1dHRvbkxhYmVsP24uY2xvc2VCdXR0b25MYWJlbDoiQ2xvc2UiLGlubGluZUNvbnRlbnQ6Zixwb3NpdGlvbjpuLnBvc2l0aW9uLGFsb25lOiEwLHNvdXJjZVNlbGVjdDpmLHNvdXJjZUJ1dHRvbjpjLG5hbWU6ZlswXS5uYW1lLHByZXZlbnROYW1lUmV1c2U6ITAsbGlnaHRib3hPcHRpb25zOmIuY2FwYWJpbGl0aWVzLm1vYmlsZXx8Yi5jYXBhYmlsaXRpZXMudGFibGV0P3tzaG93RHVyYXRpb246Yi5jYXBhYmlsaXRpZXMuaW9zP251bGw6MCxoaWRlRHVyYXRpb246MH06bnVsbH0sdHlwZVNwZWNpZmljRnVuY3Rpb25zOmIuZXh0ZW5kKHt9LGcsZSx7c2tpbjpmdW5jdGlvbihhKXt2YXIgYj1lLnN1YnNraW4/ZS5zdWJza2luKG0pOmsobSk7CmEuYXR0cnMoImlubGluZUNvbnRlbnQiLGIpO3JldHVybiBlLnNraW4oYSl9fSksYWN0aW9uQ2hlY2s6ITF9KX19KX0pOyJ1c2Ugc3RyaWN0IjsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1kcm9wZG93bi1iYXNlLWZhY3RvcnkiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1rZXlib2FyZC1oYW5kbGVycyIsZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBnKGEpe2EucmVtb3ZlRGF0YSgiYS11c2VyLW5hdmlnYXRlZC10ZXh0IikucmVtb3ZlRGF0YSgiYS11c2VyLW5hdmlnYXRlZC1pZHgiKX1mdW5jdGlvbiBjKGEsZSl7YS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIik7Im9wdGlvbiI9PT1lLmF0dHIoInJvbGUiKSYmZS5hdHRyKCJhcmlhLXNlbGVjdGVkIiwidHJ1ZSIpO2UuZm9jdXMoKX1mdW5jdGlvbiBrKGEpe3ZhciBlPWEucGFyZW50KCJ1bCIpO2E9ZS5maW5kKCJsaSIpO3ZhciBiPWUuZmluZCgiOmZvY3VzIik7MT5iLmxlbmd0aCYmKGI9ZS5maW5kKCdbYXJpYS1jaGVja2VkXHgzZCJ0cnVlIl0nKSk7CmU9YjtyZXR1cm57aW5kZXg6MDxlLmxlbmd0aD9lLmluZGV4KCk6MCwkb3B0aW9uczphfX1mdW5jdGlvbiBmKGEsZSxiKXthLnByZXZlbnREZWZhdWx0KCk7ZS5maW5kKCJhIikuZXEoMCkudHJpZ2dlcigiY2xpY2siKTtnKGIpfWZ1bmN0aW9uIGEoYSl7dmFyIGU9YS5kYXRhKCJhLXVzZXItbmF2aWdhdGVkLWRlYm91bmNlciIpO2V8fChlPWIuZGVib3VuY2UoZnVuY3Rpb24oKXtnKGEpfSwxRTMpLGEuZGF0YSgiYS11c2VyLW5hdmlnYXRlZC1kZWJvdW5jZXIiLGUpKTtlKCl9dmFyIG09Yi4kLGg9Yi5jb25zdGFudHMua2V5Y29kZXM7cmV0dXJue2tleURvd246ZnVuY3Rpb24oYSl7dmFyIGU9bSh0aGlzKSxiPWUucGFyZW50KCk7c3dpdGNoKGEud2hpY2gpe2Nhc2UgaC5VUF9BUlJPVzphLnByZXZlbnREZWZhdWx0KCk7ZyhiKTswPGsoZSkuaW5kZXgmJmMoZSxlLnByZXYoKSk7YnJlYWs7Y2FzZSBoLkRPV05fQVJST1c6YS5wcmV2ZW50RGVmYXVsdCgpO2coYik7Yj1rKGUpO2E9Yi5pbmRleDsKMDw9YSYmYSsxPGIuJG9wdGlvbnMubGVuZ3RoJiZjKGUsZS5uZXh0KCkpO2JyZWFrO2Nhc2UgaC5FTlRFUjpmKGEsZSxiKTticmVhaztjYXNlIGguRVNDQVBFOmEucHJldmVudERlZmF1bHQoKTtlPWQuZ2V0KGUuY2xvc2VzdCgiLmEtcG9wb3ZlciIpKTtlLnNvdXJjZUJ1dHRvbi5maW5kKCIuYS1idXR0b24tdGV4dCIpLmZvY3VzKCk7ZS5oaWRlKCk7ZyhiKTticmVhaztjYXNlIGguU1BBQ0U6Yi5kYXRhKCJhLXVzZXItbmF2aWdhdGVkLXRleHQiKXx8ZihhLGUsYik7YnJlYWs7Y2FzZSBoLlRBQjpnKGIpO2JyZWFrO2Nhc2UgaC5CQUNLU1BBQ0U6YS5wcmV2ZW50RGVmYXVsdCgpfX0sa2V5UHJlc3M6ZnVuY3Rpb24oYyl7dmFyIGU9bSh0aGlzKSxnPWUucGFyZW50KCksaz1kLmdldChlLmNsb3Nlc3QoIi5hLXBvcG92ZXIiKSksbD1jLndoaWNoO2lmKGsmJmsuaXNBY3RpdmUoKSYmbCE9PWguVEFCJiYwIT09bCl7YShnKTt2YXIgdT1nLmRhdGEoImEtdXNlci1uYXZpZ2F0ZWQtaWR4Iil8fAowO2lmKCEoMD51KSl7az0oZy5kYXRhKCJhLXVzZXItbmF2aWdhdGVkLXRleHQiKXx8IiIpK1N0cmluZy5mcm9tQ2hhckNvZGUobCkudG9Mb2NhbGVMb3dlckNhc2UoKTtnLmRhdGEoImEtdXNlci1uYXZpZ2F0ZWQtdGV4dCIsayk7Zm9yKHZhciByPWcuY2hpbGRyZW4oKTt1PHIubGVuZ3RoO3UrKyl7dmFyIHc9ci5lcSh1KTtpZigwPT09Yi50cmltKHcudGV4dCgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpLmluZGV4T2Yoaykpe3cuZm9jdXMoKTtnLmRhdGEoImEtdXNlci1uYXZpZ2F0ZWQtaWR4Iix1KTtyZXR1cm59fWcuZGF0YSgiYS11c2VyLW5hdmlnYXRlZC1pZHgiLC0xKTtsPT09aC5TUEFDRSYmZihjLGUsZyl9fX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tc2VsZWN0LWFwaXMiLCJhLWRyb3Bkb3duLWJhc2UtZmFjdG9yeSIsImEtcG9wb3Zlci1iYXNlIikucmVnaXN0ZXIoImEtZHJvcGRvd24tYmFzZSIsZnVuY3Rpb24oYixkLGcsYyl7ZnVuY3Rpb24gayhjLAplLGYpe3RyeXtjLiRldmVudC5wcmV2ZW50RGVmYXVsdCgpfWNhdGNoKGQpe31iLmRlbGF5KGZ1bmN0aW9uKCl7dmFyIGQ9ZS4kYnV0dG9uP2UuJGJ1dHRvbjplLmdldEJ1dHRvbkZyb21FdmVudChjKSxrPWUuJHNlbGVjdD9lLiRzZWxlY3Q6ZS5nZXRTZWxlY3RGcm9tRXZlbnQoYyk7aWYoIWQuaGFzQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIikpe20oayxlKS5pc1N5bmNlZCgpfHxhKGguZXh0ZW5kKHskYnV0dG9uOmQsJHNlbGVjdDprfSxlKSk7dmFyIGw9Yy4kZGVjbGFyYXRpdmVQYXJlbnQsaz1iLmV4dGVuZCh7fSxlLHskYnV0dG9uOmQsJHNvdXJjZVNlbGVjdDprfSkscj1nLmNyZWF0ZShsLGssZik7aWYociYmKHIuc2hvdygpLGQuZGF0YSgiYS1wb3BvdmVyLWlkIixyLmlkKS5kYXRhKCJwb3BvdmVyIixyKS5kYXRhKCJpc1ByZXNzZWQiLCEwKSwhci5oYXNPbkxvYWQpKXtyLmhhc09uTG9hZD0hMDt2YXIgdz1bXSxkPXIuJHBvcG92ZXIuZmluZCgiaW1nIik7ZC5sZW5ndGgmJihkLmVhY2goZnVuY3Rpb24oYSwKZSl7aWYoIWUuY29tcGxldGV8fCFlLm5hdHVyYWxXaWR0aCl7dmFyIGI9aC5EZWZlcnJlZCgpO3cucHVzaChiKTtoKGUpLmJpbmQoImxvYWQgZXJyb3IiLGZ1bmN0aW9uKCl7Yi5yZXNvbHZlKCl9KX19KSx3Lmxlbmd0aD9oLndoZW4uYXBwbHkoaCx3KS5kb25lKGZ1bmN0aW9uKCl7ci51cGRhdGVQb3NpdGlvbigpfSk6ci51cGRhdGVQb3NpdGlvbigpKX19fSl9ZnVuY3Rpb24gZihhKXt2YXIgZT1hLiRidXR0b247YT1hLiRzZWxlY3Q7ZXx8KGU9YS5uZXh0QWxsKCIuYS1idXR0b24tZHJvcGRvd24iKSk7cmV0dXJuIGEubGVuZ3RoPygoZT1nLmdldChlKSkmJmUuaGlkZSgpLCEwKTohMX1mdW5jdGlvbiBhKGEpe3ZhciBlPWEuJGJ1dHRvbjthPWEuJHNlbGVjdDtlfHwoZT1hLm5leHRBbGwoIi5hLWJ1dHRvbi1kcm9wZG93biIpKTtyZXR1cm4gYS5sZW5ndGg/KChlPWcuZ2V0KGUpKSYmZy5yZW1vdmUoZS5pZCksYS5kYXRhKCJhLWluZm8iLG51bGwpLCEwKTohMX1mdW5jdGlvbiBtKGMsCmUpe3ZhciBnO2M9ZS4kc2VsZWN0P2UuJHNlbGVjdDoic3RyaW5nIj09PXR5cGVvZiBjP2goInNlbGVjdCMiK2MpOmMuanF1ZXJ5P2M6aChjKTtpZighYy5sZW5ndGgpcmV0dXJuIG51bGw7Zz1lLiRidXR0b24/ZS4kYnV0dG9uOmUuZ2V0QnV0dG9uRnJvbVNlbGVjdChjKTtjLmRhdGEoImEtc2VsZWN0Iik/ZT1jLmRhdGEoImEtc2VsZWN0Iik6KGU9Yi5leHRlbmQoe2hpZGVQb3BvdmVyOmYscmVmcmVzaFBvcG92ZXI6YSxvcHRpb25zOmIuZXh0ZW5kKHskc2VsZWN0OmMsJGJ1dHRvbjpnfSxlKX0sZCksYy5kYXRhKCJhLXNlbGVjdCIsZSkpO3JldHVybiBlfXZhciBoPWIuJDtyZXR1cm57dG9nZ2xlRHJvcGRvd246ZnVuY3Rpb24oYSxlKXt2YXIgYj0oZS4kYnV0dG9uP2UuJGJ1dHRvbjplLmdldEJ1dHRvbkZyb21FdmVudChhKSkuZGF0YSgicG9wb3ZlciIpO2ImJmIuJHBvcG92ZXIuaXMoIjp2aXNpYmxlIik/Yi5oaWRlKCk6ayhhLGUpfSxzaG93RHJvcGRvd246ayxnZXRTZWxlY3Q6bX19KTsKInVzZSBzdHJpY3QiO2wud2hlbigiQSIsImpRdWVyeSIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLW9wdGlvbnMtYXBpcyIsZnVuY3Rpb24oYixkKXtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uKGIpeyJvYmplY3QiIT09dHlwZW9mIGImJmwuZXJyb3IoImlucHV0IG9mIG9wdGlvbnMudXBkYXRlKCkgZnVuY3Rpb24gbXVzdCBiZSBhIGhhc2giKTt0aGlzLmhpZGVQb3BvdmVyKHRoaXMub3B0aW9ucyk7Zm9yKHZhciBjPTAsZD10aGlzLnNpemUoKTtjPGQ7YysrKXt2YXIgZj10aGlzLm9wdGlvbnMuZWxlbWVudHNbY10sYT1mWzBdO2IudmFsdWUmJmYudmFsKGIudmFsdWUpO3ZvaWQgMCE9PWIuc2VsZWN0ZWQmJighYS5zZWxlY3RlZCYmYi5zZWxlY3RlZD90aGlzLm9wdGlvbnMuJHNlbGVjdC52YWwoYS52YWx1ZSk6YS5zZWxlY3RlZCYmIWIuc2VsZWN0ZWQmJnRoaXMub3B0aW9ucy4kc2VsZWN0LnZhbCgiIikpO2IuaHRtbF9jb250ZW50JiZmLmRhdGEoImEtaHRtbC1jb250ZW50IixiLmh0bWxfY29udGVudCk7CmIuaW1hZ2Vfc291cmNlJiZmLmRhdGEoImEtaW1hZ2Utc291cmNlIixiLmltYWdlX3NvdXJjZSk7Yi5uYXRpdmVfY3NzX2NsYXNzJiYoYS5jbGFzc05hbWU9Yi5uYXRpdmVfY3NzX2NsYXNzKTtiLmNzc19jbGFzcyYmZi5kYXRhKCJhLWNzcy1jbGFzcyIsYi5jc3NfY2xhc3MpO2IubmF0aXZlX2lkJiYoYS5pZD1iLm5hdGl2ZV9pZCk7Yi5pZCYmZi5kYXRhKCJhLWlkIixiLmlkKTtiLnRleHQmJihmLnRleHQoYi50ZXh0KSxhLnNlbGVjdGVkJiZ0aGlzLnNldFNlbGVjdFZhbHVlKGEudmFsdWUpKX10aGlzLnJlZnJlc2hQb3BvdmVyKHRoaXMub3B0aW9ucyk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuaGlkZVBvcG92ZXIodGhpcy5vcHRpb25zKTtmb3IodmFyIGI9MCxjPXRoaXMuc2l6ZSgpO2I8YztiKyspe3ZhciBkPXRoaXMub3B0aW9ucy5lbGVtZW50c1tiXTtkLmlzKCI6c2VsZWN0ZWQiKSYmdGhpcy5zZXRTZWxlY3RWYWx1ZSgiIik7ZC5yZW1vdmUoKX10aGlzLnJlZnJlc2hQb3BvdmVyKHRoaXMub3B0aW9ucyk7CnJldHVybiEwfSxpbmZvOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGM9MCxkPXRoaXMuc2l6ZSgpO2M8ZDtjKyspe3ZhciBmPXRoaXMub3B0aW9ucy5lbGVtZW50c1tjXTtiLnB1c2goe3ZhbHVlOmZbMF0udmFsdWUsdGV4dDpmLnRleHQoKSxzZWxlY3RlZDpmWzBdLnNlbGVjdGVkLGh0bWxfY29udGVudDpmLmRhdGEoImEtaHRtbC1jb250ZW50IiksaW1hZ2Vfc291cmNlOmYuZGF0YSgiYS1pbWFnZS1zb3VyY2UiKSxuYXRpdmVfY3NzX2NsYXNzOmZbMF0uY2xhc3NOYW1lLGNzc19jbGFzczpmLmRhdGEoImEtY3NzLWNsYXNzIiksbmF0aXZlX2lkOmZbMF0uaWQsaWQ6Zi5kYXRhKCJhLWlkIil9KX1yZXR1cm4gYn0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuZWxlbWVudHMubGVuZ3RofX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwialF1ZXJ5IiwiYS1kcm9wZG93bi1vcHRpb25zLWFwaXMiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1zZWxlY3QtYXBpcyIsZnVuY3Rpb24oYiwKZCxnKXtmdW5jdGlvbiBjKGEpe3ZhciBiPXRoaXMub3B0aW9ucy4kc2VsZWN0LGM9dGhpcy5vcHRpb25zLiRidXR0b24sbj1iWzBdOyJudW1iZXIiPT09dHlwZW9mIGEmJihhPWEudG9TdHJpbmcoKSk7Zm9yKHZhciBlPTAsZD1uLm9wdGlvbnMubGVuZ3RoO2U8ZCYmbi5vcHRpb25zW2VdLnZhbHVlIT09YTtlKyspO2U9PT1kJiYiIj09PWEmJihlPTApO2U8ZCYmKGMuZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikuaHRtbChuLm9wdGlvbnNbZV0uaW5uZXJIVE1MKSxjLmNzcygibWluLXdpZHRoIixlL24ub3B0aW9ucy5sZW5ndGgrIiUiKSxiLnZhbCgpIT09YSYmKGIudmFsKGEpLGIudHJpZ2dlcigiY2hhbmdlIixbZiwhMF0pKSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gayhhKXtpZihhPT09ZilyZXR1cm4gdGhpcy5vcHRpb25zLiRzZWxlY3QudmFsKCk7dGhpcy5zZXRWYWx1ZT1jO3JldHVybiB0aGlzLnNldFZhbHVlKGEpfXZhciBmO3JldHVybntpc1N5bmNlZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLm9wdGlvbnMuJHNlbGVjdCxjPWEuZGF0YSgiYS1pbmZvIiksaD10aGlzLmdldE9wdGlvbnMoKS5pbmZvKCk7YS5kYXRhKCJhLWluZm8iLGgpO3JldHVybiBjP2IuZXF1YWxzKGMsaCk6ITB9LHVwZGF0ZTpmdW5jdGlvbihhKXsib2JqZWN0IiE9PXR5cGVvZiBhJiZsLmVycm9yKCJpbnB1dCBvZiBzZWxlY3QudXBkYXRlKCkgZnVuY3Rpb24gbXVzdCBiZSBhbiBvYmplY3QiKTt0aGlzLmhpZGVQb3BvdmVyKHRoaXMub3B0aW9ucyk7dmFyIGI9e25vbmU6ITAsbWljcm86ITAsbWluaTohMCxzbWFsbDohMCxiYXNlOiEwLG1lZGl1bTohMCxsYXJnZTohMCwiZXh0cmEtbGFyZ2UiOiEwLCJkb3VibGUtbGFyZ2UiOiEwLGJsb2NrOiEwfSxjPXRoaXMub3B0aW9ucy4kc2VsZWN0LG49Y1swXSxlPXRoaXMub3B0aW9ucy4kYnV0dG9uLGc9ZVswXSxrPWMuc2libGluZ3MoImxhYmVsIik7YS5uYW1lJiYobi5uYW1lPWEubmFtZSk7aWYoYS5vcHRpb25fcHJvbXB0KXt2YXIgcT1jLmZpbmQoIi5hLXByb21wdCIpOwpxLmxlbmd0aD8ocS50ZXh0KGEub3B0aW9uX3Byb21wdCkscS5wcm9wKCJzZWxlY3RlZCIpJiZlLmZpbmQoIi5hLWRyb3Bkb3duLXByb21wdCIpLnRleHQoYS5vcHRpb25fcHJvbXB0KSk6KGMucHJlcGVuZChkKCJceDNjb3B0aW9uIGNsYXNzXHgzZCdhLXByb21wdCcgL1x4M2UiKS50ZXh0KGEub3B0aW9uX3Byb21wdCkpLGUuZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikudGV4dChhLm9wdGlvbl9wcm9tcHQpKX1hLmhhc19pbWFnZXMhPT1mJiZjLmRhdGEoImEtaGFzLWltYWdlcyIsISFhLmhhc19pbWFnZXMpO2EuYnV0dG9uX3NpemUhPT1mJiZlLmxlbmd0aCYmKCJzbWFsbCI9PT1hLmJ1dHRvbl9zaXplP2UuYWRkQ2xhc3MoImEtYnV0dG9uLXNtYWxsIik6ZS5yZW1vdmVDbGFzcygiYS1idXR0b24tc21hbGwiKSk7YS5zcGFjaW5nIT09ZiYmYi5oYXNPd25Qcm9wZXJ0eShhLnNwYWNpbmcpJiYoYj0vXGJhLXNwYWNpbmctW2Etel0rXGIvZyxuLmNsYXNzTmFtZT1uLmNsYXNzTmFtZS5yZXBsYWNlKGIsCiIiKSxnLmNsYXNzTmFtZT1nLmNsYXNzTmFtZS5yZXBsYWNlKGIsIiIpLGMuYWRkQ2xhc3MoImEtc3BhY2luZy0iK2Euc3BhY2luZyksZS5hZGRDbGFzcygiYS1zcGFjaW5nLSIrYS5zcGFjaW5nKSk7YS5ncmlkX3VuaXRzIT09ZiYmKGI9L1xiYS1idXR0b24tc3BhblxkezEsMn1cYi9nLG4uY2xhc3NOYW1lPW4uY2xhc3NOYW1lLnJlcGxhY2UoYiwiIiksZy5jbGFzc05hbWU9Zy5jbGFzc05hbWUucmVwbGFjZShiLCIiKSxpc0Zpbml0ZShhLmdyaWRfdW5pdHMpJiYwPGEuZ3JpZF91bml0cyYmMTM+YS5ncmlkX3VuaXRzJiYoYy5hZGRDbGFzcygiYS1idXR0b24tc3BhbiIrYS5ncmlkX3VuaXRzKSxlLmFkZENsYXNzKCJhLWJ1dHRvbi1zcGFuIithLmdyaWRfdW5pdHMpKSk7YS53aWR0aF9uYW1lJiYoImJhc2UiPT09YS53aWR0aF9uYW1lZD9lLmFkZENsYXNzKCJhLWJ1dHRvbi13aWR0aC1ub3JtYWwiKTplLnJlbW92ZUNsYXNzKCJhLWJ1dHRvbi13aWR0aC1ub3JtYWwiKSk7aWYoYS5zdGF0dXMpe3ZhciB1PQphLnN0YXR1cyxiPWUuY2xvc2VzdCgiLmEtZHJvcGRvd24tY29udGFpbmVyLCAuYS1zcGxpdGRyb3Bkb3duLWNvbnRhaW5lciIpLmZpbmQoIi5hLWJ1dHRvbiIpLHE9ImVycm9yIj09PXUsdT0iZGlzYWJsZWQiPT09dTtuLmRpc2FibGVkPXU7Yi50b2dnbGVDbGFzcygiYS1idXR0b24tZGlzYWJsZWQiLHUpO3U/Yi5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpOmIucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpO2IudG9nZ2xlQ2xhc3MoImEtYnV0dG9uLWVycm9yIixxKX1hLm5hdGl2ZV9pZCYmKG4uaWQ9YS5uYXRpdmVfaWQsay5sZW5ndGgmJihrWzBdLmh0bWxGb3I9YS5uYXRpdmVfaWQpKTthLmlkJiYoZy5pZD1hLmlkKTthLm5hdGl2ZV9jc3NfY2xhc3MmJigoZz1jLmRhdGEoImEtbmF0aXZlLWNsYXNzIikpJiZjLnJlbW92ZUNsYXNzKGcpLGMuYWRkQ2xhc3MoYS5uYXRpdmVfY3NzX2NsYXNzKS5kYXRhKCJhLW5hdGl2ZS1jbGFzcyIsYS5uYXRpdmVfY3NzX2NsYXNzKSk7YS5jc3NfY2xhc3MmJgooKGc9ZS5kYXRhKCJhLWNsYXNzIikpJiZlLnJlbW92ZUNsYXNzKGcpLGUuYWRkQ2xhc3MoYS5jc3NfY2xhc3MpLmRhdGEoImEtY2xhc3MiLGEuY3NzX2NsYXNzKSk7YS5sYWJlbF90ZXh0IT09ZiYmKCIiPT09YS5sYWJlbF90ZXh0PyhlLmZpbmQoIi5hLWRyb3Bkb3duLWxhYmVsIikucmVtb3ZlKCksYy5zaWJsaW5ncygibGFiZWwiKS5yZW1vdmUoKSk6KGc9ZS5maW5kKCIuYS1kcm9wZG93bi1sYWJlbCIpLGcubGVuZ3RoP2cudGV4dChhLmxhYmVsX3RleHQpOmUuZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikuYmVmb3JlKGQoIlx4M2NzcGFuIGNsYXNzXHgzZCdhLWRyb3Bkb3duLWxhYmVsJyAvXHgzZSIpLnRleHQoYS5sYWJlbF90ZXh0KSksay5sZW5ndGg/ay50ZXh0KGEubGFiZWxfdGV4dCk6Yy5iZWZvcmUoZCgiXHgzY2xhYmVsIGZvclx4M2QnIituLmlkKyInIGNsYXNzXHgzZCdhLW5hdGl2ZS1kcm9wZG93bicgL1x4M2UiKS50ZXh0KGEubGFiZWxfdGV4dCkpKSxlLmNzcygibWluLXdpZHRoIiwKIiI9PT1hLmxhYmVsX3RleHQ/IjAuMSUiOiIwJSIpKTt0aGlzLnJlZnJlc2hQb3BvdmVyKHRoaXMub3B0aW9ucyk7cmV0dXJuIHRoaXN9LHNldFZhbHVlOmMsdmFsOmssZ2V0T3B0aW9uczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLm9wdGlvbnMuJHNlbGVjdCxoPVtdO2E9YT09PWY/Yy5jaGlsZHJlbigib3B0Z3JvdXAsIG9wdGlvbjpub3QoLmEtcHJvbXB0KSIpOmQuaXNBcnJheShhKT9hOlthXTtmb3IodmFyIG49MCxlPWEubGVuZ3RoO248ZTtuKyspe3ZhciBwPWFbbl0sbD1bXTtiLmlzRmluaXRlTnVtYmVyKHApP2w9Yy5jaGlsZHJlbigib3B0Z3JvdXAsIG9wdGlvbjpub3QoLmEtcHJvbXB0KSIpLmVxKHApOiJzdHJpbmciPT09dHlwZW9mIHA/bD1jLmNoaWxkcmVuKCJvcHRpb24jIitwKToib2JqZWN0Ij09PXR5cGVvZiBwJiYobD1wLmpxdWVyeT9wOmQocCkpO2wubGVuZ3RoJiZoLnB1c2gobCl9cmV0dXJuIGIuZXh0ZW5kKHtoaWRlUG9wb3Zlcjp0aGlzLmhpZGVQb3BvdmVyLHJlZnJlc2hQb3BvdmVyOnRoaXMucmVmcmVzaFBvcG92ZXIsCnNldFNlbGVjdFZhbHVlOmssb3B0aW9uczpiLmV4dGVuZCh7ZWxlbWVudHM6aH0sdGhpcy5vcHRpb25zKX0sZyl9LGdldE9wdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPcHRpb25zKGEpfSxhZGRPcHRpb25zOmZ1bmN0aW9uKGEsYil7ZC5pc0FycmF5KGEpfHwoYT1bYV0pO2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KXRoaXMuYWRkT3B0aW9uKGFbY10sYik7cmV0dXJuIHRoaXN9LGFkZE9wdGlvbjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3B0aW9ucy4kc2VsZWN0O2lmKCFhLm5hdGl2ZV9pZHx8IWMuZmluZCgib3B0aW9uIyIrYS5uYXRpdmVfaWQpLmxlbmd0aCl7dmFyIGY9Yy5jaGlsZHJlbigib3B0Z3JvdXAsIG9wdGlvbjpub3QoLmEtcHJvbXB0KSIpLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7Yj1iJiYwPGImJmI8PWYubGVuZ3RoP2I6MDthLm5hdGl2ZV9pZCYmKGUuaWQ9YS5uYXRpdmVfaWQpOzA9PT1mLmxlbmd0aHx8Yj09PWYubGVuZ3RoPwpjWzBdLmFwcGVuZENoaWxkKGUpOmYuZXEoYikuYmVmb3JlKGUpO3RoaXMuZ2V0T3B0aW9uKGUpLnVwZGF0ZShhKX1yZXR1cm4gdGhpc30scmVtb3ZlT3B0aW9uczpmdW5jdGlvbihhKXt0aGlzLmdldE9wdGlvbnMoYSkucmVtb3ZlKCk7cmV0dXJuIHRoaXN9LHJlbW92ZU9wdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmVPcHRpb25zKGEpfSxhcHBlbmRPcHRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkT3B0aW9uKGEsdGhpcy5vcHRpb25zLiRzZWxlY3QuY2hpbGRyZW4oIm9wdGdyb3VwLCBvcHRpb246bm90KC5hLXByb21wdCkiKS5sZW5ndGgpfSxhcHBlbmRPcHRpb25zOmZ1bmN0aW9uKGEpe2lmKGQuaXNBcnJheShhKSlmb3IodmFyIGI9MCxjPWEubGVuZ3RoO2I8YztiKyspdGhpcy5hZGRPcHRpb24oYVtiXSk7cmV0dXJuIHRoaXN9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLWRyb3Bkb3duLW9wdGlvbnMiLCJhLWRyb3Bkb3duLWFwaXMiLCJhLWRyb3Bkb3duLWtleWJvYXJkLWhhbmRsZXJzIikucmVnaXN0ZXIoImEtZHJvcGRvd24iLApmdW5jdGlvbihiLGQsZyxjKXt2YXIgaz1iLiQ7Yz1rKGRvY3VtZW50KTtjLmRlbGVnYXRlKCIuYS1uYXRpdmUtZHJvcGRvd24iLCJjaGFuZ2UiLGZ1bmN0aW9uKGMsYSxtKXt2YXIgaD1kLmdldEJ1dHRvbkZyb21FdmVudChjKSxuPSIiLGU9LTE8dGhpcy5zZWxlY3RlZEluZGV4P3RoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlOiIiLHA9aC5kYXRhKCJwb3BvdmVyIik7Yz0hMTt2YXIgbDtpZihoLmxlbmd0aCl7Zm9yKHZhciBoPWguZXEoMCkscT10aGlzLmxlbmd0aDtxLS07KWlmKGw9dGhpcy5vcHRpb25zW3FdLGwudmFsdWU9PT1lKXtuPWwuaW5uZXJIVE1MO2JyZWFrfXAmJnAuJHBvcG92ZXImJihwLiRwb3BvdmVyLmZpbmQoIi5hLWFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhLWFjdGl2ZSIpLmNsb3Nlc3QoImxpIikuYXR0cigiYXJpYS1jaGVja2VkIiwhMSksdm9pZCAwPT09YSYmKGE9SlNPTi5zdHJpbmdpZnkoe3N0cmluZ1ZhbDplfSksYT1wLiRwb3BvdmVyLmZpbmQoJ2FbZGF0YS12YWx1ZVx4M2QiJysKYi5lc2NhcGVKcXVlcnlTZWxlY3RvcihhKSsnIl0nKSkpO2EmJmEubGVuZ3RoJiYoYz0hMCxhLmFkZENsYXNzKCJhLWFjdGl2ZSIpLmNsb3Nlc3QoImxpIikuYXR0cigiYXJpYS1jaGVja2VkIiwhMCkpO2guZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikuaHRtbChuKTtoLmNzcygibWluLXdpZHRoIix0aGlzLnNlbGVjdGVkSW5kZXgvdGhpcy5vcHRpb25zLmxlbmd0aCsiJSIpO3AmJihwLmhpZGUoKSwoaD1nLmdldFNlbGVjdCh0aGlzKSkmJmsodGhpcykuZGF0YSgiYS1pbmZvIixoLmdldE9wdGlvbnMoKS5pbmZvKCkpKTttfHwobT10aGlzLm5hbWUsaD10aGlzLmlkLGE9e2F1aUl0ZW1Ob2RlOmM/YVswXTpudWxsLG5hdGl2ZUl0ZW1Ob2RlOnRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLHNlbGVjdE5vZGU6dGhpcyxpZDpoLG5hbWU6bSx2YWx1ZTp0aGlzLnZhbHVlfSxtJiYiIiE9PW0mJihiLnRyaWdnZXIoImE6ZHJvcGRvd246IittKyI6c2VsZWN0IixhKSxiLnRyaWdnZXIoImE6ZHJvcGRvd246c2VsZWN0ZWQ6IisKbSxhKSksaCYmIiIhPT1oJiZiLnRyaWdnZXIoImE6ZHJvcGRvd246IitoKyI6c2VsZWN0IixhKSxiLnRyaWdnZXIoImE6ZHJvcGRvd246c2VsZWN0IixhKSl9fSk7Yy5kZWxlZ2F0ZSgiLmEtYnV0dG9uLWRyb3Bkb3duOm5vdCguYS1idXR0b24tZGlzYWJsZWQpIiwiZm9jdXNpbiIsZnVuY3Rpb24oKXtrKHRoaXMpLmZpbmQoIi5hLWJ1dHRvbi10ZXh0IikuZm9jdXMoKX0pO3JldHVybiBnfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZSIsImEtZHJvcGRvd24tb3B0aW9ucyIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLWFwaXMiLGZ1bmN0aW9uKGIsZCxnKXtmdW5jdGlvbiBjKGIpe3JldHVybiBkLmdldFNlbGVjdChiLGcpfXZhciBrPWIuJDtiLm9uKCJiZWZvcmVSZWFkeSIsZnVuY3Rpb24oKXtrKCIuYS1kcm9wZG93bi1jb250YWluZXIgc2VsZWN0IikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWModGhpcyk7YiYmYi52YWwoYi52YWwoKSl9KX0pO3JldHVybntnZXRTZWxlY3Q6YywKdXBkYXRlT3B0aW9uOmZ1bmN0aW9uKGIsYSl7dmFyIGc9aygib3B0aW9uIyIrYikuY2xvc2VzdCgic2VsZWN0Iik7YyhnKS5nZXRPcHRpb24oYikudXBkYXRlKGEpfSx1cGRhdGVTZWxlY3Q6ZnVuY3Rpb24oYixhKXtjKGIpLnVwZGF0ZShhKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYixhKXtjKGIpLnNldFZhbHVlKGEpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHkiKS5yZWdpc3RlcigiYS1kcm9wZG93bi12aWV3IixmdW5jdGlvbihiLGQpe3JldHVybntza2luOmZ1bmN0aW9uKGIpe3ZhciBjPWIuYXR0cnMoImhlYWRlciIpfHwiIjtiPXtpZDpiLmlkLGhlYWRlcl9zdHI6YyxuZWVkc19kZWNsYXJhdGl2ZTohMX07cmV0dXJuWydceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXIgYS1kcm9wZG93biBhLWRyb3Bkb3duLWNvbW1vbiBhLWRlY2xhcmF0aXZlIiBkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWExMXkiXHgzZScsZC5nZXRTdGFydEFuY2hvckh0bWwoYiksCidceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItd3JhcHBlciJceDNlXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWlubmVyIlx4M2VceDNjL2Rpdlx4M2VceDNjL2Rpdlx4M2UnLGQuZ2V0RW5kQW5jaG9ySHRtbChiKSwiXHgzYy9kaXZceDNlIl0uam9pbigiIil9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLWRyb3Bkb3duLWJhc2UiLCJhLWRyb3Bkb3duLXZpZXciLCJhLWRyb3Bkb3duLW9wdGlvbnMiLCJhLWRyb3Bkb3duLWFwaXMiLCJhLWRyb3Bkb3duLWJhc2UtZmFjdG9yeSIsImEtZHJvcGRvd24ta2V5Ym9hcmQtaGFuZGxlcnMiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1oYW5kbGVycyIsZnVuY3Rpb24oYixkLGcsYyxrLGYsYSl7dmFyIG09Yi4kO2s9bShkb2N1bWVudCk7Yi5kZWNsYXJhdGl2ZSgiYS1kcm9wZG93bi1idXR0b24iLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIGY9Yy5nZXRCdXR0b25Gcm9tRXZlbnQoYSk7ZC5zaG93RHJvcGRvd24oYSxiLmV4dGVuZCh7JGJ1dHRvbjpmfSwKYyksZyl9KTtiLmRlY2xhcmF0aXZlKCJhLWRyb3Bkb3duLWJ1dHRvbiIsImtleWRvd24iLGZ1bmN0aW9uKGEpe3ZhciBmPWMuZ2V0QnV0dG9uRnJvbUV2ZW50KGEpLGU9Yi5jb25zdGFudHMua2V5Y29kZXMsaz1hLiRldmVudC53aGljaDtrIT09ZS5ET1dOX0FSUk9XJiZrIT09ZS5FTlRFUiYmayE9PWUuU1BBQ0V8fGQuc2hvd0Ryb3Bkb3duKGEsYi5leHRlbmQoeyRidXR0b246Zn0sYyksZyl9KTtrLmRlbGVnYXRlKCIuYS1wb3BvdmVyLmEtZHJvcGRvd24gYSIsImNsaWNrIixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCk7YT1tKHRoaXMpO3ZhciBiPWYuZ2V0KGEuY2xvc2VzdCgiLmEtcG9wb3ZlciIpKTtpZihhLmhhc0NsYXNzKCJhLWFjdGl2ZSIpKWIuaGlkZSgpO2Vsc2V7dmFyIGU9YS5kYXRhKCJ2YWx1ZSIpLnN0cmluZ1ZhbDtiLnNvdXJjZVNlbGVjdC52YWwoZSkudHJpZ2dlcigiY2hhbmdlIixbYV0pfX0pO2EmJihhLmtleURvd24mJmsuZGVsZWdhdGUoIi5hLWRyb3Bkb3duIGxpIiwKImtleWRvd24iLGEua2V5RG93biksYS5rZXlQcmVzcyYmay5kZWxlZ2F0ZSgiLmEtZHJvcGRvd24gbGkiLCJrZXlwcmVzcyIsYS5rZXlQcmVzcykpfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLW9wdGlvbnMiLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoYil7cmV0dXJuIGIucG9wb3Zlcj9iLnBvcG92ZXIuJHRyaWdnZXIuY2xvc2VzdCgiLmEtYnV0dG9uLWRyb3Bkb3duIik6Yi4kdGFyZ2V0P2IuJHRhcmdldC5jbG9zZXN0KCIuYS1idXR0b24tZHJvcGRvd24iKTpnKGIudGFyZ2V0KS5uZXh0QWxsKCIuYS1idXR0b24tZHJvcGRvd24iKX12YXIgZz1iLiQ7cmV0dXJue2dldEJ1dHRvbkZyb21FdmVudDpkLGdldEJ1dHRvbkZyb21TZWxlY3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGIubmV4dEFsbCgiLmEtYnV0dG9uLWRyb3Bkb3duIil9LGdldFNlbGVjdEZyb21FdmVudDpmdW5jdGlvbihiKXtiPWQoYikucHJldkFsbCgic2VsZWN0IikuZXEoMCk7Yi5sZW5ndGh8fApsLmVycm9yKCJDYW5ub3QgbG9jYXRlIHRoZSBceDNjc2VsZWN0XHgzZSBvZiBkcm9wZG93biIpO3JldHVybiBifSx0cmlnZ2VyU2VsZWN0b3I6Ii5hLWJ1dHRvbi1kcm9wZG93biJ9fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci1hY2Nlc3NpYmlsaXR5IikucmVnaXN0ZXIoImEtZHJvcGRvd24tc3BsaXQtdmlldyIsZnVuY3Rpb24oYixkKXtyZXR1cm57c2tpbjpmdW5jdGlvbihiKXt2YXIgYz1iLmF0dHJzKCJoZWFkZXIiKXx8IiI7Yj17aWQ6Yi5pZCxsYWJlbF9zdHI6YyxuZWVkc19kZWNsYXJhdGl2ZTohMX07cmV0dXJuWydceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXIgYS1zcGxpdGRyb3Bkb3duIGEtZHJvcGRvd24tY29tbW9uIGEtZGVjbGFyYXRpdmUiIGRhdGEtYWN0aW9uXHgzZCJhLXBvcG92ZXItYTExeSJceDNlJyxkLmdldFN0YXJ0QW5jaG9ySHRtbChiKSwnXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLXdyYXBwZXIiXHgzZVxuXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWlubmVyIlx4M2VceDNjL2Rpdlx4M2Vcblx4M2MvZGl2XHgzZScsCmQuZ2V0RW5kQW5jaG9ySHRtbChiKSwiXHgzYy9kaXZceDNlIl0uam9pbigiXG4iKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZSIsImEtZHJvcGRvd24tc3BsaXQtdXRpbHMiLCJhLWRyb3Bkb3duLXNwbGl0LXZpZXciLCJhLWRyb3Bkb3duLXNwbGl0LW9wdGlvbnMiLCJhLWRyb3Bkb3duLWJhc2UtZmFjdG9yeSIsImEtZHJvcGRvd24ta2V5Ym9hcmQtaGFuZGxlcnMiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1zcGxpdC1oYW5kbGVycyIsZnVuY3Rpb24oYixkLGcsYyxrLGYsYSl7dmFyIG09Yi4kO2IuZGVjbGFyYXRpdmUoImEtc3BsaXRkcm9wZG93bi1idXR0b24iLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIGY9ay5nZXRCdXR0b25Gcm9tRXZlbnQoYSk7ZC5zaG93RHJvcGRvd24oYSxiLmV4dGVuZCh7JGJ1dHRvbjpmfSxrKSxjKX0pO2IuZGVjbGFyYXRpdmUoImEtc3BsaXRkcm9wZG93bi1tYWluIiwiY2xpY2siLGZ1bmN0aW9uKGEpe3ZhciBiPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1zcGxpdGRyb3Bkb3duLWNvbnRhaW5lciIpLmZpbmQoInNlbGVjdCIpLAplPWIuYXR0cigiaWQiKSxjPWIudmFsKCk7Zy50cmlnZ2VyRXZlbnQoZSxiLGMpO2EuJGV2ZW50LnByZXZlbnREZWZhdWx0KCl9KTtiLmRlY2xhcmF0aXZlKCJhLXNwbGl0ZHJvcGRvd24tYnV0dG9uIiwia2V5ZG93biIsZnVuY3Rpb24oYSl7dmFyIGY9ay5nZXRCdXR0b25Gcm9tRXZlbnQoYSksZT1iLmNvbnN0YW50cy5rZXljb2RlcyxnPWEuJGV2ZW50LndoaWNoO2chPT1lLkRPV05fQVJST1cmJmchPT1lLkVOVEVSJiZnIT09ZS5TUEFDRXx8ZC5zaG93RHJvcGRvd24oYSxtLmV4dGVuZCh7JGJ1dHRvbjpmfSxrKSxjKX0pO20oZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1wb3BvdmVyLmEtc3BsaXRkcm9wZG93biBhIiwiY2xpY2siLGZ1bmN0aW9uKGEpe3ZhciBiPW0odGhpcyksZT1iLmRhdGEoInZhbHVlIikuc3RyaW5nVmFsLGI9Zi5nZXQoYi5jbG9zZXN0KCIuYS1wb3BvdmVyIikpLGM9Yi5zb3VyY2VTZWxlY3QsZD1jLmF0dHIoImlkIik7Yi5oaWRlKCk7Zy50cmlnZ2VyRXZlbnQoZCwKYyxlKTthLnByZXZlbnREZWZhdWx0KCl9KS5kZWxlZ2F0ZSgiLmEtc3BsaXRkcm9wZG93biBsaSIsImtleWRvd24iLGEua2V5RG93bikuZGVsZWdhdGUoIi5hLXNwbGl0ZHJvcGRvd24gbGkiLCJrZXlwcmVzcyIsYS5rZXlQcmVzcyl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIikucmVnaXN0ZXIoImEtZHJvcGRvd24tc3BsaXQtb3B0aW9ucyIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChiKXtyZXR1cm4gYi5wb3BvdmVyP2IucG9wb3Zlci4kdHJpZ2dlci5jbG9zZXN0KCIuYS1idXR0b24tc3BsaXRkcm9wZG93biIpOmIuJHRhcmdldD9iLiR0YXJnZXQuY2xvc2VzdCgiLmEtYnV0dG9uLXNwbGl0ZHJvcGRvd24iKTpnKGIudGFyZ2V0KS5uZXh0QWxsKCIuYS1idXR0b24tc3BsaXRkcm9wZG93biIpfXZhciBnPWIuJDtyZXR1cm57Z2V0QnV0dG9uRnJvbUV2ZW50OmQsZ2V0QnV0dG9uRnJvbVNlbGVjdDpmdW5jdGlvbihiKXtyZXR1cm4gYi5uZXh0KCIuYS1idXR0b24tZ3JvdXAtc3BsaXRkcm9wZG93biIpLmZpbmQoIi5hLWJ1dHRvbi1zcGxpdGRyb3Bkb3duIil9LApnZXRTZWxlY3RGcm9tRXZlbnQ6ZnVuY3Rpb24oYil7Yj1kKGIpLmNsb3Nlc3QoIi5hLXNwbGl0ZHJvcGRvd24tY29udGFpbmVyIikuZmluZCgic2VsZWN0Iik7Yi5sZW5ndGh8fGwuZXJyb3IoImNhbm5vdCBsb2NhdGUgdGhlIFx4M2NzZWxlY3RceDNlIG9mIHRoZSBzcGxpdCBkcm9wZG93biIpO3JldHVybiBifX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIikucmVnaXN0ZXIoImEtZHJvcGRvd24tc3BsaXQtdXRpbHMiLGZ1bmN0aW9uKGIpe3JldHVybnt0cmlnZ2VyRXZlbnQ6ZnVuY3Rpb24oZCxnLGMpe2c9eyRzZWxlY3Q6Zyx2YWx1ZTpjLGlkOmR9O2IudHJpZ2dlcigiYTpzcGxpdGRyb3Bkb3duOiIrZCsiOnNlbGVjdCIsZyk7Yi50cmlnZ2VyKCJhOnNwbGl0ZHJvcGRvd246c2VsZWN0IixnKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZSIsImEtZHJvcGRvd24tc3BsaXQtb3B0aW9ucyIsImEtZHJvcGRvd24tc3BsaXQtdXRpbHMiLCJhLWRyb3Bkb3duLXNwbGl0LWhhbmRsZXJzIikucmVnaXN0ZXIoImEtc3BsaXRkcm9wZG93biIsCmZ1bmN0aW9uKGIsZCxnLGMsayl7dmFyIGY9Yi4kO2YoZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1uYXRpdmUtc3BsaXRkcm9wZG93biIsImNoYW5nZSIsZnVuY3Rpb24oYSxiLGgpe2E9Zih0aGlzKTtiPWEudmFsKCk7dmFyIGQ9YS5hdHRyKCJpZCIpO2h8fGMudHJpZ2dlckV2ZW50KGQsYSxiKX0pLmRlbGVnYXRlKCIuYS1idXR0b24tc3BsaXRkcm9wZG93bjpub3QoLmEtYnV0dG9uLWRpc2FibGVkKSIsImZvY3VzaW4iLGZ1bmN0aW9uKCl7Zih0aGlzKS5maW5kKCIuYS1idXR0b24tdGV4dCIpLmZvY3VzKCl9KTtyZXR1cm57Z2V0U2VsZWN0OmZ1bmN0aW9uKGEpe3JldHVybiBkLmdldFNlbGVjdChhLGcpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHktdGVtcGxhdGVzIikucmVnaXN0ZXIoImEtcG9wb3Zlci1hY2Nlc3NpYmlsaXR5IixmdW5jdGlvbihiLGQpe3ZhciBnPWQuc3RhcnRBbmNob3JUZW1wbGF0ZSxjPWQuc3RhcnRBbmNob3JEZWNsYXJhdGl2ZVRlbXBsYXRlLAprPWQuZW5kQW5jaG9yVGVtcGxhdGUsZj1kLmRlc2NyaXB0aW9uVGVtcGxhdGUsYT1mdW5jdGlvbihhLGIpe3ZhciBlPXsie3tERVNDUklQVElPTn19IjpiLCJ7e0RFU0NSSVBUSU9OX0lEfX0iOmF9O3JldHVybiBmLnJlcGxhY2UoL1x7XHtbXHdfXSpcfVx9L2csZnVuY3Rpb24oYSl7cmV0dXJuIGVbYV19KX0sbT1mdW5jdGlvbihhKXt2YXIgYj1hLmlkLGU9YS5oZWFkZXJfc3RyO3JldHVybihhPWEubGFiZWxfc3RyKT8nYXJpYS1sYWJlbFx4M2QiJythKyciJzplPydhcmlhLWxhYmVsbGVkYnlceDNkImEtcG9wb3Zlci1oZWFkZXItJytiKyciJzoiIn07cmV0dXJue2dldFN0YXJ0QW5jaG9ySHRtbDpmdW5jdGlvbihoKXt2YXIgZj1oLmlkLGU9aC5sYWJlbF9zdHIsZD1oLmFyaWFfZGVzY3JpcHRpb24saz0iIjtpZighZilyZXR1cm4iIjt2YXIgbD17Int7Uk9MRX19Ijoncm9sZVx4M2QiZGlhbG9nIicsInt7QU5DSE9SX05BTUV9fSI6ImEtcG9wb3Zlci1zdGFydCIsInt7QVJJQV9MQUJFTH19IjptKGgpLAoie3tMQUJFTF9TVFJ9fSI6ZXx8IiIsInt7QVJJQV9ERVNDUklCRURCWX19IjoiIn07aD1oLm5lZWRzX2RlY2xhcmF0aXZlP2M6ZztkJiYhYi5jYXBhYmlsaXRpZXMuaW9zJiYoZj0iYS1wb3BvdmVyLWFyaWEtZGVzY3JpcHRpb24tIitmLGxbInt7QVJJQV9ERVNDUklCRURCWX19Il09J2FyaWEtZGVzY3JpYmVkYnlceDNkIicrZisnIicsaz1hKGYsZCkpO2IuY2FwYWJpbGl0aWVzLmlvcyYmKGxbInt7Uk9MRX19Il09IiIpO2g9aC5yZXBsYWNlKC9ce1x7W1x3X10qXH1cfS9nLGZ1bmN0aW9uKGEpe3JldHVybiBsW2FdfSkraztiLmNhcGFiaWxpdGllcy5pb3MmJihoPWgucmVwbGFjZSgvc3Bhbi9nLCJidXR0b24iKSk7cmV0dXJuIGgucmVwbGFjZSgvXHNccz58XHM+L2csIlx4M2UiKX0sZ2V0RW5kQW5jaG9ySHRtbDpmdW5jdGlvbihhKXthPWs7Yi5jYXBhYmlsaXRpZXMuaW9zJiYoYT1hLnJlcGxhY2UoL3NwYW4vZywiYnV0dG9uIikpO3JldHVybiBhfX19KTsidXNlIHN0cmljdCI7bC5kZWNsYXJlKCJhLXBvcG92ZXItYWNjZXNzaWJpbGl0eS10ZW1wbGF0ZXMiLAp7c3RhcnRBbmNob3JUZW1wbGF0ZTonXHgzY3NwYW4gdGFiaW5kZXhceDNkIjAiIHJvbGVceDNkImRpYWxvZyIgY2xhc3NceDNkInt7QU5DSE9SX05BTUV9fSBhLXBvcG92ZXItYTExeS1vZmZzY3JlZW4iIHt7QVJJQV9MQUJFTH19IHt7QVJJQV9ERVNDUklCRURCWX19XHgzZVx4M2Mvc3Bhblx4M2UnLHN0YXJ0QW5jaG9yRGVjbGFyYXRpdmVUZW1wbGF0ZTonXHgzY3NwYW4gdGFiaW5kZXhceDNkIjAiIHJvbGVceDNkImRpYWxvZyIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1hMTF5IiBjbGFzc1x4M2Qie3tBTkNIT1JfTkFNRX19IGEtcG9wb3Zlci1hMTF5LW9mZnNjcmVlbiBhLWRlY2xhcmF0aXZlIiB7e0FSSUFfTEFCRUx9fSB7e0FSSUFfREVTQ1JJQkVEQll9fVx4M2V7e0xBQkVMX1NUUn19XHgzYy9zcGFuXHgzZScsZW5kQW5jaG9yVGVtcGxhdGU6J1x4M2NzcGFuIHRhYmluZGV4XHgzZCIwIiBjbGFzc1x4M2QiYS1wb3BvdmVyLWVuZCBhLXBvcG92ZXItYTExeS1vZmZzY3JlZW4iXHgzZVx4M2Mvc3Bhblx4M2UnLApkZXNjcmlwdGlvblRlbXBsYXRlOidceDNjc3BhbiBpZFx4M2Qie3tERVNDUklQVElPTl9JRH19IiBjbGFzc1x4M2QiYS1wb3BvdmVyLWExMXktb2Zmc2NyZWVuIlx4M2V7e0RFU0NSSVBUSU9OfX1ceDNjL3NwYW5ceDNlJ30pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItdXRpbCIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYWpheCIsZnVuY3Rpb24oYixkKXtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZj17fTtmLnVybD1jO2QudGltZW91dCYmKGYudGltZW91dD1kLnRpbWVvdXQpO2QuYWpheEZhaWxNc2cmJihmLmFqYXhGYWlsTXNnPWQuYWpheEZhaWxNc2cpO2QuY2FjaGUmJihmLmNhY2hlPWQuY2FjaGUpO2IudXBkYXRlKGYpfSxzaG93U3Bpbm5lcjpmdW5jdGlvbihiKXtyZXR1cm4gZC5zaG93U3Bpbm5lcihiKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYW5pbWF0ZSIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChjLApkKXtyZXR1cm4gZnVuY3Rpb24oKXtiW2NdLmFwcGx5KGIsZCl9fWZ1bmN0aW9uIGcoYixkKXtyZXR1cm4gZnVuY3Rpb24oKXtiLl9pc0FuaW1hdGluZz0hMTtkJiZkKCl9fXJldHVybntpc0FuaW1hdGluZzpmdW5jdGlvbihiKXtyZXR1cm4gYi5faXNBbmltYXRpbmd9LGFuaW1hdGU6ZnVuY3Rpb24oYyxrLGYsYSxtKXtjLl9pc0FuaW1hdGluZz0wPGY7Yi5hbmltYXRpb25GcmFtZURlbGF5KGQoImFuaW1hdGUiLFtjLiRwb3BvdmVyLGssZixhLGcoYyxtKV0pKX0sZmFkZU91dDpmdW5jdGlvbihjLGssZixhKXtjLl9pc0FuaW1hdGluZz0wPGs7Yi5hbmltYXRpb25GcmFtZURlbGF5KGQoImZhZGVPdXQiLFtjLiRwb3BvdmVyLGssZixnKGMsYSldKSl9LGZhZGVJbjpmdW5jdGlvbihjLGssZixhKXtjLl9pc0FuaW1hdGluZz0wPGs7Yi5hbmltYXRpb25GcmFtZURlbGF5KGQoImZhZGVJbiIsW2MuJHBvcG92ZXIsayxmLGcoYyxhKV0pKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIiwKImEtcG9wb3Zlci1pbmxpbmUtc3RyYXRlZ3kiLCJhLXBvcG92ZXItcHJlbG9hZC1zdHJhdGVneSIsImEtcG9wb3Zlci1hamF4LXN0cmF0ZWd5IikucmVnaXN0ZXIoImEtcG9wb3Zlci1kYXRhIixmdW5jdGlvbihiLGQsZyxjLGspe3ZhciBmPVtrLGMsZ107cmV0dXJue2d1ZXNzU3RyYXRlZ3lCeUF0dHJzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9Zi5sZW5ndGg7YjxjO2IrKyl7dmFyIGQ9ZltiXTtpZihkLmlzVmFsaWRTdHJhdGVneShhKSlyZXR1cm4gZH19LGdldFN0cmF0ZWd5QnlOYW1lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9Zi5sZW5ndGg7YjxjO2IrKyl7dmFyIGQ9ZltiXTtpZihkLm5hbWU9PT1hKXJldHVybiBkfXJldHVybiBudWxsfSxzaG93U3Bpbm5lcjpkLnNob3dTcGlubmVyfX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItbGlnaHRib3gtbWFya3VwIiwiYS10aW1pbmctYW5hbHl0aWNzIiwicmVhZHkiKS5yZWdpc3RlcigiYS1wb3BvdmVyLWxpZ2h0Ym94IiwKZnVuY3Rpb24oYixkLGcpe2Z1bmN0aW9uIGMoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2Euc3RvcFByb3BhZ2F0aW9uKCk7YS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtyZXR1cm4hMX1mdW5jdGlvbiBrKCl7dS51bmJpbmQoImNsaWNrIixjKTtxPSExfWZ1bmN0aW9uIGYoZSl7dmFyIGQ9YSh0KTstMTx3fHwhcnx8KGU9ZXx8e30sdS5iaW5kKCJjbGljayIsYykscT0hMCwibnVtYmVyIiE9PXR5cGVvZiBlLmhpZGVEdXJhdGlvbiYmKGUuaGlkZUR1cmF0aW9uPTI1MCksMDxlLmhpZGVEdXJhdGlvbj9iLmZhZGVPdXQocixlLmR1cmF0aW9uLCJsaW5lYXIiLGZ1bmN0aW9uKCl7ZS5sb2NrU2Nyb2xsJiYoYSgiaHRtbCwgYm9keSIpLmNzcygib3ZlcmZsb3ciLCIiKSxhKCJib2R5IikuY3NzKCJtYXJnaW4tcmlnaHQiLCIiKSxiLmRlbGF5KGZ1bmN0aW9uKCl7MDx4JiYoZC5zY3JvbGxUb3AoeCkseD0tMSk7MDx6JiYoZC5zY3JvbGxMZWZ0KHopLHo9LTEpfSwxMDApKTt5PW51bGx9KTooci5jc3MoImRpc3BsYXkiLAoibm9uZSIpLGUubG9ja1Njcm9sbCYmKGEoImh0bWwsIGJvZHkiKS5jc3MoIm92ZXJmbG93IiwiIiksYSgiYm9keSIpLmNzcygibWFyZ2luLXJpZ2h0IiwiIiksMDx4JiYoZC5zY3JvbGxUb3AoeCkseD0tMSkpLHk9bnVsbCksci5jc3Moe2hlaWdodDoiIix3aWR0aDoiIn0pLGIuZGVsYXkoayxlLmhpZGVEdXJhdGlvbiszNTApLGEoIiNhLXBhZ2UiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpKX12YXIgYT1iLiQsbT0tMTxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoIi1pZSIpLGg9Yi5jYXBhYmlsaXRpZXMuaXNJRTEwUGx1cyYmYi5jYXBhYmlsaXRpZXMubW9iaWxlLG49MD09PShiLmNhcGFiaWxpdGllcy5hbmRyb2lkVmVyc2lvbisiIikuaW5kZXhPZigiNC4iKSxlPWIuY2FwYWJpbGl0aWVzLmlzVUNCcm93c2VyLHA9ZC5pZCxsPWQuZGl2LHE9ITEsdT1hKCJib2R5Iikscj1udWxsLHc9LTEseD0tMSx6PS0xLHk9bnVsbDthKGRvY3VtZW50KS5kZWxlZ2F0ZSgiIyIrCnAsImNsaWNrICIrYi5hY3Rpb24uc3RhcnQrIiAiK2IuYWN0aW9uLm1vdmUsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyLWZsb2F0aW5nLWNsb3NlIixiLmNhcGFiaWxpdGllcy50b3VjaD9iLmFjdGlvbi5lbmQ6ImNsaWNrIixmdW5jdGlvbihhKXshcSYmYS4kdGFyZ2V0LmRhdGEoImFjdGlvbiIpJiYtMTxhLiR0YXJnZXQuZGF0YSgiYWN0aW9uIikuaW5kZXhPZigiYS1wb3BvdmVyLWZsb2F0aW5nLWNsb3NlIikmJih5JiZ5LmlzQWN0aXZlKCk/KHkudW5sb2NrKCkuaGlkZSgpLGEuJGV2ZW50LnByZXZlbnREZWZhdWx0KCkpOmYoKSl9KTtpZihiLmNhcGFiaWxpdGllcy5pc2lPUzgpYi5vbigiYTpwb3BvdmVyOmFmdGVyVXBkYXRlUG9zaXRpb24iLGZ1bmN0aW9uKGIpe2I9Yi5wb3BvdmVyO3ZhciBlPWEoIiMiK3ApLGM9ZS5sZW5ndGg/ZS5vZmZzZXQoKS50b3A6LTEsZD1hKHQpLGYsaDtiLmlzQWN0aXZlKCkmJmIuYXR0cnMoImxpZ2h0Ym94T3B0aW9ucyIpJiYKYyYmKGY9MCxoPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZC5zY3JvbGxUb3AoYyk7NTwrK2YmJmNsZWFySW50ZXJ2YWwoaCl9LDIwMCkpfSk7Zy5zdG9wV2lkZ2V0TG9nZ2luZygiZHJvcGRvd24iKTtyZXR1cm57c2hvdzpmdW5jdGlvbihkKXthKCIjYS1wYWdlIikuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIik7dmFyIGY9YSh0KTtyfHwoYSgiYm9keSIpLmFwcGVuZChsKSxyPWEoIiMiK3ApKTtkPWR8fHt9O3UuYmluZCgiY2xpY2siLGMpO3E9ITA7ZC5sb2NrU2Nyb2xsJiYoLTE9PT14JiYoeD1mLnNjcm9sbFRvcCgpLHo9Zi5zY3JvbGxMZWZ0KCkpLGIuc2V0Q3NzSW1wb3J0YW50KGEoImJvZHkiKSwibWFyZ2luLXJpZ2h0IixiLnNjcm9sbEJhcldpZHRoKCkrInB4IiksaHx8KG0/YSgiaHRtbCwgYm9keSIpLmNzcygib3ZlcmZsb3ciLCJoaWRkZW4iKTphKCJib2R5IikuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpKSk7dmFyIGc9KHk9ZC5wb3BvdmVyfHxudWxsKT95LiRwb3BvdmVyLmNzcygiei1pbmRleCIpLQoyOi0xOzA8ZyYmKHIuY3NzKCJ6LWluZGV4IixnKSxuJiZmLndpZHRoKCkpOyJudW1iZXIiIT09dHlwZW9mIGQuc2hvd0R1cmF0aW9uJiYoZC5zaG93RHVyYXRpb249MjAwKTtlJiZ5LiRwb3BvdmVyLmNzcygib3ZlcmZsb3ciLCJhdXRvIik7MDxkLnNob3dEdXJhdGlvbj9iLmZhZGVJbihyLGQuc2hvd0R1cmF0aW9uKTpyLmNzcygiZGlzcGxheSIsImJsb2NrIik7Yi5kZWxheShrLGQuc2hvd0R1cmF0aW9uKzMwMCl9LGhpZGU6Zixsb2NrOmZ1bmN0aW9uKGEpe2F8fChhPTEwKTt3PGEmJih3PWEpfSx1bmxvY2s6ZnVuY3Rpb24oYSl7YXx8KGE9MTApO3c8PWEmJih3PS0xKX0sTElHSFRCT1hfSUQ6cH19KTtsLmRlY2xhcmUoImEtcG9wb3Zlci1saWdodGJveC1tYXJrdXAiLHtpZDoiYS1wb3BvdmVyLWxndGJveCIsZGl2OidceDNjZGl2IGlkXHgzZCJhLXBvcG92ZXItbGd0Ym94IiBjbGFzc1x4M2QiYS1kZWNsYXJhdGl2ZSIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1mbG9hdGluZy1jbG9zZSIgL1x4M2UnfSk7CiJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJyZWFkeSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItbmF2aWdhdGUiLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoYSl7InN0cmluZyI9PT10eXBlb2YgYSYmKGY9ITAsdC5sb2NhdGlvbi5oYXNoPWEpO3JldHVybiB0LmxvY2F0aW9uLmhhc2h8fCIifXZhciBnPWIuJCxnPWcodCksYz1bXSxrPVtdLGY9ITEsYT17fSxtPSExO2sucHVzaChkKCkpO2cuYmluZCgiaGFzaGNoYW5nZSIsZnVuY3Rpb24oYyl7Yy5wcmV2ZW50RGVmYXVsdCgpO20/bT0hMTprLnB1c2goZCgpKTszMjw9ay5sZW5ndGgmJmsuc2hpZnQoKTtmP2Y9ITE6Yi50cmlnZ2VyKCJhOnBvcG92ZXI6bmF2aWdhdGUiLGFba1trLmxlbmd0aC0xXV0pfSk7Yi5vbigiYTpwb3BvdmVyOm5hdmlnYXRlIixmdW5jdGlvbihhKXthP2Euc2hvdyh7cHJldmVudE5hdmlnYXRlOiEwfSk6KGE9MDw9Yy5sZW5ndGgtMT9jW2MubGVuZ3RoLTFdOm51bGwpJiZhLnVubG9jaygpLmhpZGUoe3ByZXZlbnROYXZpZ2F0ZTohMH0pfSk7CmIub24oImE6cG9wb3ZlcjpzaG93TmF2aWdhYmxlIGE6cG9wb3ZlcjpzaG93TmF2aWdhYmxlTGVnYWN5IixmdW5jdGlvbihhKXtjLnB1c2goYS5wb3BvdmVyKX0pO2Iub24oImE6cG9wb3ZlcjpoaWRlTmF2aWdhYmxlIGE6cG9wb3ZlcjpoaWRlTmF2aWdhYmxlTGVnYWN5IixmdW5jdGlvbihhKXtjLnBvcCgpfSk7cmV0dXJue2ZvcndhcmQ6ZnVuY3Rpb24oYyl7dmFyIGY9Yy5uYW1lKyJfIitiLm5vdygpO2FbIiMiK2ZdPWM7ZChmKX0sYmFjazpmdW5jdGlvbigpezA8ay5sZW5ndGgmJmsucG9wKCk7bT0hMDt0Lmhpc3RvcnkuYmFjaygpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIikucmVnaXN0ZXIoImEtcG9wb3Zlci1wb3NpdGlvbiIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChjLGUpe3ZhciBkPWIudmlld3BvcnQoKSxnOzE9PT1iLnZpZXdwb3J0KCkuem9vbT9nPXt0b3A6MCxsZWZ0OjB9OihhfHwoYT1mKCdceDNjc3BhbiBpZFx4M2QiYS1wb3BvdmVyLW9mZnNldC10cmFja2VyIlx4M2VceDNjL3NwYW5ceDNlJyksCmYoImJvZHkiKS5wcmVwZW5kKGEpKSxnPWEub2Zmc2V0KCkpO3ZhciBrPWUub2Zmc2V0KCksbD1jLm9mZnNldCgpO2lmKGgpe3ZhciByPXQucGFnZVlPZmZzZXQtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtrLnRvcC09cjtsLnRvcC09cn1rLnRvcC09Zy50b3A7ay5sZWZ0LT1nLmxlZnQ7bC50b3AtPWcudG9wO2wubGVmdC09Zy5sZWZ0O3I9ZS5vdXRlcldpZHRoKCk7ZT1lLm91dGVySGVpZ2h0KCk7dmFyIHc9Yy5vdXRlcldpZHRoKCEwKSx4PWMub3V0ZXJIZWlnaHQoITApO2M9Yy5maW5kKCIuYS1wb3BvdmVyLWhlYWRlciIpO2M9Yy5sZW5ndGg/Yy5vdXRlckhlaWdodCghMCk6MDtyZXR1cm57d2luZG93V2lkdGg6ZC53aWR0aCx3aW5kb3dIZWlnaHQ6ZC5oZWlnaHQsd2luZG93VG9wOmQuc2Nyb2xsVG9wLHdpbmRvd0xlZnQ6ZC5zY3JvbGxMZWZ0LHdpbmRvd1JpZ2h0OmQuc2Nyb2xsTGVmdCtkLndpZHRoLHdpbmRvd0JvdHRvbTpkLnNjcm9sbFRvcCtkLmhlaWdodCwKem9vbVRvcDpnLnRvcCx6b29tTGVmdDpnLmxlZnQsdHJpZ2dlcldpZHRoOnIrMSx0cmlnZ2VySGVpZ2h0OmUsdHJpZ2dlclRvcDprLnRvcC1tLHRyaWdnZXJMZWZ0OmsubGVmdC1tLHRyaWdnZXJSaWdodDprLmxlZnQrcittLHRyaWdnZXJCb3R0b206ay50b3ArZSttLHRyaWdnZXJWZXJ0aWNhbENlbnRlcjprLnRvcCtlLzIsdHJpZ2dlckhvcml6b250YWxDZW50ZXI6ay5sZWZ0K3IvMixwb3BvdmVyV2lkdGg6dyxwb3BvdmVySGVpZ2h0OngscG9wb3ZlclRvcDpsLnRvcCxwb3BvdmVyTGVmdDpsLmxlZnQscG9wb3ZlclJpZ2h0OmwubGVmdCt3LHBvcG92ZXJCb3R0b206bC50b3AreCxwb3BvdmVyVmVydGljYWxDZW50ZXI6bC50b3AreC8yLHBvcG92ZXJIb3Jpem9udGFsQ2VudGVyOmwubGVmdCt3LzIsaGVhZGVySGVpZ2h0OmN9fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGEucmVtb3ZlQ2xhc3MoImEtYXJyb3ctdG9wIGEtYXJyb3ctYm90dG9tIGEtYXJyb3ctbGVmdCBhLWFycm93LXJpZ2h0Iil9CmZ1bmN0aW9uIGMoYSl7dmFyIGI9e2RlbHRhVG9wOjB9LGM7Yi50b3A9YS50cmlnZ2VyVmVydGljYWxDZW50ZXItYS5wb3BvdmVySGVpZ2h0LzI7Yi50b3A8YS53aW5kb3dUb3ArMjA/KGM9TWF0aC5taW4oYS53aW5kb3dUb3ArMjAsYS50cmlnZ2VyVG9wLTIwKSxiLmRlbHRhVG9wPWIudG9wLWMsYi50b3A9Yyk6Yi50b3ArYS5wb3BvdmVySGVpZ2h0PmEud2luZG93Qm90dG9tLTIwJiYoYz1NYXRoLm1pbigyMCxhLndpbmRvd0JvdHRvbS1hLnRyaWdnZXJCb3R0b20rMjApLGIuZGVsdGFUb3A9Yi50b3ArYS5wb3BvdmVySGVpZ2h0LShhLndpbmRvd0JvdHRvbS1jKSxiLnRvcD1hLndpbmRvd0JvdHRvbS1jLWEucG9wb3ZlckhlaWdodCk7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhKXt2YXIgYj17ZGVsdGFMZWZ0OjB9LGM7Yi5sZWZ0PWEudHJpZ2dlckhvcml6b250YWxDZW50ZXItYS5wb3BvdmVyV2lkdGgvMjsyMD5iLmxlZnQ/KGM9TWF0aC5taW4oMjAsYS50cmlnZ2VyTGVmdC0yMCksYi5kZWx0YUxlZnQ9CmIubGVmdC1jLGIubGVmdD1jKTpiLmxlZnQrYS5wb3BvdmVyV2lkdGg+YS53aW5kb3dSaWdodC0yMCYmKGM9TWF0aC5taW4oMjAsYS53aW5kb3dSaWdodC1hLnRyaWdnZXJSaWdodCsyMCksYi5kZWx0YUxlZnQ9Yi5sZWZ0K2EucG9wb3ZlcldpZHRoLShhLndpbmRvd1JpZ2h0LWMpLGIubGVmdD1hLndpbmRvd1JpZ2h0LWMtYS5wb3BvdmVyV2lkdGgpO3JldHVybiBifXZhciBmPWIuJDtmKHQpO3ZhciBhPW51bGwsbT0xLGg9Yi5jYXBhYmlsaXRpZXMubW9iaWxlJiZiLmNhcGFiaWxpdGllcy5pc0lFMTBQbHVzO2wud2hlbigicHJ2OnNraW4tdmFycy1kZXNrdG9wIikuZXhlY3V0ZShmdW5jdGlvbihhKXttPWEucG9wb3Zlci5QT1BPVkVSX1NQQUNJTkc/YS5wb3BvdmVyLlBPUE9WRVJfU1BBQ0lORzptfSk7cmV0dXJue3dpbmRvd0NlbnRlcjpmdW5jdGlvbihhKXthPWQoYS4kcG9wb3ZlcixhLiR0cmlnZ2VyKTt2YXIgYj17fTtiLnRvcD0oYS53aW5kb3dIZWlnaHQtYS5wb3BvdmVySGVpZ2h0KS8KMjtiLmxlZnQ9KGEud2luZG93V2lkdGgtYS5wb3BvdmVyV2lkdGgpLzI7MD5iLnRvcCYmKGIudG9wPTApO3JldHVybiBifSx3aW5kb3dUb3A6ZnVuY3Rpb24oYSl7YT1kKGEuJHBvcG92ZXIsYS4kdHJpZ2dlcik7dmFyIGI9e3RvcDowfTtiLmxlZnQ9YS53aW5kb3dXaWR0aC8yLWEucG9wb3ZlcldpZHRoLzI7cmV0dXJuIGJ9LHdpbmRvd0Z1bGxXaWR0aDpmdW5jdGlvbihhKXtyZXR1cm57dG9wOjAsbGVmdDowfX0sdHJpZ2dlclJpZ2h0OmZ1bmN0aW9uKGEsYil7dmFyIGY9YS4kcG9wb3ZlcixoPWEuJHRyaWdnZXI7Ynx8KGI9ZChmLGgpKTtoPWMoYik7aC5sZWZ0PWIudHJpZ2dlclJpZ2h0O2EuYXR0cnMoInBvcG92ZXJBcnJvdyIpJiYoZyhmKS5hZGRDbGFzcygiYS1hcnJvdy1yaWdodCIpLGYuZmluZCgiLmEtYXJyb3ctYm9yZGVyIikuY3NzKCJ0b3AiLGIucG9wb3ZlckhlaWdodC8yK2guZGVsdGFUb3ApKTtyZXR1cm4gaH0sdHJpZ2dlckxlZnQ6ZnVuY3Rpb24oYSxiKXt2YXIgZj1hLiRwb3BvdmVyLApoPWEuJHRyaWdnZXI7Ynx8KGI9ZChmLGgpKTtoPWMoYik7aC5sZWZ0PWIudHJpZ2dlckxlZnQtYi5wb3BvdmVyV2lkdGg7aC5sZWZ0PTA8aC5sZWZ0P2gubGVmdDowO2EuYXR0cnMoInBvcG92ZXJBcnJvdyIpJiYoZyhmKS5hZGRDbGFzcygiYS1hcnJvdy1sZWZ0IiksZi5maW5kKCIuYS1hcnJvdy1ib3JkZXIiKS5jc3MoInRvcCIsYi5wb3BvdmVySGVpZ2h0LzIraC5kZWx0YVRvcCkpO3JldHVybiBofSx0cmlnZ2VyVG9wOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Ynx8KGI9ZChjLGYpKTtmPWsoYik7Zi50b3A9Yi50cmlnZ2VyVG9wLWIucG9wb3ZlckhlaWdodDthLmF0dHJzKCJwb3BvdmVyQXJyb3ciKSYmKGcoYykuYWRkQ2xhc3MoImEtYXJyb3ctdG9wIiksYy5maW5kKCIuYS1hcnJvdy1ib3JkZXIiKS5jc3MoImxlZnQiLGIucG9wb3ZlcldpZHRoLzIrZi5kZWx0YUxlZnQpKTtyZXR1cm4gZn0sdHJpZ2dlckJvdHRvbTpmdW5jdGlvbihhLGIpe3ZhciBjPQphLiRwb3BvdmVyLGY9YS4kdHJpZ2dlcjtifHwoYj1kKGMsZikpO2Y9ayhiKTtmLnRvcD1iLnRyaWdnZXJCb3R0b207YS5hdHRycygicG9wb3ZlckFycm93IikmJihnKGMpLmFkZENsYXNzKCJhLWFycm93LWJvdHRvbSIpLGMuZmluZCgiLmEtYXJyb3ctYm9yZGVyIikuY3NzKCJsZWZ0IixiLnBvcG92ZXJXaWR0aC8yK2YuZGVsdGFMZWZ0KSk7cmV0dXJuIGZ9LHRyaWdnZXJIb3Jpem9udGFsOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Ynx8KGI9ZChjLGYpKTtyZXR1cm4gYi50cmlnZ2VyTGVmdC1iLndpbmRvd0xlZnQ+Yi53aW5kb3dSaWdodC1iLnRyaWdnZXJSaWdodD90aGlzLnRyaWdnZXJMZWZ0KGEsYik6dGhpcy50cmlnZ2VyUmlnaHQoYSxiKX0sdHJpZ2dlclZlcnRpY2FsOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Yj1iP2I6ZChjLGYpO3JldHVybiBiLnRyaWdnZXJUb3AtYi53aW5kb3dUb3A+Yi5wb3BvdmVySGVpZ2h0KwoyMD90aGlzLnRyaWdnZXJUb3AoYSxiKTp0aGlzLnRyaWdnZXJCb3R0b20oYSxiKX0sdHJpZ2dlclZlcnRpY2FsQWxpZ25MZWZ0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Ynx8KGI9ZChjLGYpKTt2YXIgZj17fSxoPTAsayxtPWIud2luZG93Qm90dG9tLWIudHJpZ2dlckJvdHRvbTtmLmxlZnQ9Yi50cmlnZ2VyTGVmdDtmLnRvcD1tPmIucG9wb3ZlckhlaWdodD9iLnRyaWdnZXJCb3R0b20rMzpiLnRyaWdnZXJUb3AtYi5wb3BvdmVySGVpZ2h0LTM7MjA+Zi5sZWZ0PyhrPU1hdGgubWluKDIwLGIudHJpZ2dlckxlZnQtMjApLGg9Zi5sZWZ0LWssZi5sZWZ0PWspOmYubGVmdCtiLnBvcG92ZXJXaWR0aD5iLndpbmRvd1JpZ2h0LTIwJiYoaz1NYXRoLm1pbigyMCxiLndpbmRvd1JpZ2h0LWIudHJpZ2dlclJpZ2h0KzIwKSxoPWYubGVmdCtiLnBvcG92ZXJXaWR0aC0oYi53aW5kb3dSaWdodC1rKSxmLmxlZnQ9Yi53aW5kb3dSaWdodC1rLWIucG9wb3ZlcldpZHRoKTsKYS5hdHRycygicG9wb3ZlckFycm93IikmJihnKGMpLmFkZENsYXNzKG0+Yi5wb3BvdmVySGVpZ2h0PyJhLWFycm93LWJvdHRvbSI6ImEtYXJyb3ctdG9wIiksYy5maW5kKCIuYS1hcnJvdy1ib3JkZXIiKS5jc3MoImxlZnQiLGIudHJpZ2dlcldpZHRoLzIraCkpO3JldHVybiBmfSxjdXN0b21Qb3NpdGlvbjpmdW5jdGlvbihhLGIpe3JldHVybiBiLmNhbGwodGhpcyx7cG9wb3ZlcjphLCRwb3BvdmVyOmEuJHBvcG92ZXIsJHRyaWdnZXI6YS4kdHJpZ2dlcixtZWFzdXJlOmR9KX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItdXRpbCIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChiLGMpe2Zvcih2YXIgYT1iLmNoaWxkcmVuLmxlbmd0aDthLS07KXt2YXIgZz1kKGIuY2hpbGRyZW5bYV0sYyk7aWYoZylyZXR1cm4gZ31pZihjKGIpKXJldHVybiBifXZhciBnPWIuJCxjPS9eLT9cZCsoPzpcLlxkKyk/JC87cmV0dXJue3RyaWdnZXI6ZnVuY3Rpb24oYyxmKXtiLnRyaWdnZXIoImE6cG9wb3ZlcjoiKwpjLHtwb3BvdmVyOmZ9KTtmLm5hbWUmJmIudHJpZ2dlcigiYTpwb3BvdmVyOiIrYysiOiIrZi5uYW1lLHtwb3BvdmVyOmZ9KX0sZXh0cmFjdERlY2xhcmF0aXZlUGFyYW1zOmZ1bmN0aW9uKGMsZil7Yz1nKGMpO2M9Yy5oYXNDbGFzcygiYS1kZWNsYXJhdGl2ZSIpP2M6Yy5maW5kKCIuYS1kZWNsYXJhdGl2ZSIpLmVxKDApO2Y9ImEtIitmO3ZhciBhPWMuZGF0YSgiYWN0aW9uIik7cmV0dXJuIGEmJmIuY29udGFpbnMoYSxmKT97YXR0cmlidXRlczpjLmRhdGEoZil8fG51bGwsJHRyaWdnZXI6Y306bnVsbH0sZXZlbnRPY2N1cnNXaXRoaW46ZnVuY3Rpb24oYixjKXtiPWcoYi50YXJnZXQpO3JldHVybiAwPGIuY2xvc2VzdChjLiR0cmlnZ2VyKS5sZW5ndGh8fDA8Yi5jbG9zZXN0KGMuJHBvcG92ZXIpLmxlbmd0aH0sc2VhcmNoOmQsZ2V0Q1NTSGFzaDpmdW5jdGlvbihkKXt2YXIgZj17fTtiLmVhY2goImhlaWdodCB3aWR0aCBtYXgtaGVpZ2h0IG1heC13aWR0aCBtaW4taGVpZ2h0IG1pbi13aWR0aCIuc3BsaXQoIiAiKSwKZnVuY3Rpb24oYSl7aWYoZFthXSl7dmFyIGc9ZFthXTtpZihiLmlzRmluaXRlTnVtYmVyKGcpfHxjLnRlc3QoZykpZys9InB4IjtmW2FdPWd9fSk7Zi5oZWlnaHQmJiFmWyJtYXgtaGVpZ2h0Il0mJihmWyJtYXgtaGVpZ2h0Il09Im5vbmUiKTtmLndpZHRoJiYhZlsibWF4LXdpZHRoIl0mJihmWyJtYXgtd2lkdGgiXT0ibm9uZSIpO3JldHVybiBmfSxjbGVhckNvbnRlbnQ6ZnVuY3Rpb24oYil7KGI9Yi5nZXRDb250ZW50KCkpJiZiLmVtcHR5KCl9LHNob3dTcGlubmVyOmZ1bmN0aW9uKGIpe2IudXBkYXRlQ29udGVudCgnXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWxvYWRpbmctd3JhcHBlciBhLXRleHQtY2VudGVyIlx4M2VceDNjZGl2IGNsYXNzXHgzZCJhLWJveCBhLWNvbG9yLWJhc2UtYmFja2dyb3VuZCBhLXBvcG92ZXItbG9hZGluZyJceDNlXHgzYy9kaXZceDNlXHgzYy9kaXZceDNlJyk7Yi51cGRhdGVQb3NpdGlvbigpO3JldHVybiBifSxnZXRCb29sOmZ1bmN0aW9uKGIsCmMpe3JldHVybiB2b2lkIDAhPT1iPyEwPT09Ynx8InRydWUiPT09YjohMD09PWN9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItdXRpbCIsImEtcG9wb3Zlci1hbmltYXRlIikucmVnaXN0ZXIoImEtbW9kYWwtdmlldy1iYXNlIixmdW5jdGlvbihiLGQsZyl7dmFyIGM9Yi4kLGs9YygiaHRtbCIpLmhhc0NsYXNzKCJhLWx0LWllOSIpO3JldHVybntzZXRBcmlhQnVzeTpmdW5jdGlvbihiKXt0aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItd3JhcHBlciIpLmF0dHIoImFyaWEtYnVzeSIsYil9LHVwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oYil7InN0cmluZyI9PT10eXBlb2YgYj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItaW5uZXIiKS5odG1sKGIpOmImJnRoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmh0bWwoIiIpLmFwcGVuZChiKX0sdXBkYXRlRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJHBvcG92ZXIsYT1kLmdldENTU0hhc2godGhpcy5hdHRycygpKTsKIXRoaXMuZHJhZ2dhYmxlfHxhLndpZHRoJiYiYXV0byIhPT1hLndpZHRofHwoYS53aWR0aD1iLndpZHRoKCkrInB4Iik7Yi5jc3MoYSk7YS5oZWlnaHQ/Yi5hZGRDbGFzcygiYS1wb3BvdmVyLW1vZGFsLWZpeGVkLWhlaWdodCIpOmIucmVtb3ZlQ2xhc3MoImEtcG9wb3Zlci1tb2RhbC1maXhlZC1oZWlnaHQiKTt0aGlzLmlzQWN0aXZlKCkmJnRoaXMudXBkYXRlUG9zaXRpb24oKTtyZXR1cm4gdGhpc30sZ2V0Q29udGVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRwb3BvdmVyP3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpOm51bGx9LHNob3dNZXRob2Q6ZnVuY3Rpb24oYyl7dmFyIGE9dGhpcyxtPWEuJHBvcG92ZXI7bS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSkucmVtb3ZlQ2xhc3MoImEtcG9wb3Zlci1oaWRkZW4iKTtrfHwiYWpheCI9PT1hLmF0dHJzKCJjdXJyZW50RGF0YVN0cmF0ZWd5Iik/Yy5jYWxsKGEpOihtLmNzcyh7b3BhY2l0eTowfSksZy5hbmltYXRlKGEsCntvcGFjaXR5OjF9LDUwMCwibGluZWFyIixmdW5jdGlvbigpe2MuY2FsbChhKX0pKTtiLmFuaW1hdGlvbkZyYW1lRGVsYXkoZnVuY3Rpb24oKXthLmZvY3VzKCl9KTthLmF0dHJzKCJsZWdhY3lOYXZpZ2FibGUiKSYmZC50cmlnZ2VyKCJzaG93TmF2aWdhYmxlTGVnYWN5IixhKX0saGlkZU1ldGhvZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzO2s/KGEuJHBvcG92ZXIuaGlkZSgpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLmZpbmQoIi5hLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKS5yZW1vdmVDbGFzcygiYS1sZ3Rib3gtdmVydGljYWwtc2Nyb2xsIiksYi5jYWxsKGEpKTpnLmZhZGVPdXQoYSwyNTAsImxpbmVhciIsZnVuY3Rpb24oKXtiLmNhbGwoYSl9KTthLmF0dHJzKCJsZWdhY3lOYXZpZ2FibGUiKSYmZC50cmlnZ2VyKCJoaWRlTmF2aWdhYmxlTGVnYWN5IixhKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtbW9kYWwtdmlldy1iYXNlIiwiYS1tb2RhbC1wb3NpdGlvbnMiLAoiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHkiKS5yZWdpc3RlcigiYS1tb2RhbC12aWV3IixmdW5jdGlvbihiLGQsZyxjKXt2YXIgaz1iLiQsaz1rKCJodG1sIikuaGFzQ2xhc3MoImEtbHQtaWU5Iik7cmV0dXJuIGIuZXh0ZW5kKGQsYi5jYXBhYmlsaXRpZXMudG91Y2h8fGIuY2FwYWJpbGl0aWVzLm1vYmlsZXx8Yi5jYXBhYmlsaXRpZXMudGFibGV0fHxrP2cuaW5uZXJTY3JvbGw6Zy5tb2RhbFNjcm9sbCx7c2tpbjpmdW5jdGlvbihiKXt2YXIgYT1iLmF0dHJzKCJpZCIpLGQ9Yi5hdHRycygiaGVhZGVyIil8fCIiLGg9Yi5hdHRycygiaGlkZUhlYWRlciIpfHwhMSxnPWIuYXR0cnMoImZvb3RlciIpLGU9Yi5hdHRycygibW9kZWxlc3MiKXx8ITEsaz1iLmF0dHJzKCJjbG9zZUJ1dHRvbiIpLGw9Yi5hdHRycygiY2xvc2VCdXR0b25MYWJlbCIpP2IuYXR0cnMoImNsb3NlQnV0dG9uTGFiZWwiKToiIixxPWIuYXR0cnMoImhpZGVIZWFkZXJDbG9zZUJ1dHRvbkxheW91dCIpfHwiIix1PWIuYXR0cnMoInBvcG92ZXJMYWJlbCIpPwpiLmF0dHJzKCJwb3BvdmVyTGFiZWwiKToiIixyPWIuYXR0cnMoInBhZGRpbmciKTtiPWIuYXR0cnMoImFyaWFEZXNjcmlwdGlvbiIpO3U9e2lkOmEsaGVhZGVyX3N0cjpkLGxhYmVsX3N0cjp1LGFyaWFfZGVzY3JpcHRpb246Yn07az1bJ1x4M2NidXR0b24gZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1jbG9zZSIgY2xhc3NceDNkIicsaz8iIjoiIGEtYnV0dG9uLWNsb3NlLWExMXkiLCIgYS1idXR0b24tY2xvc2UgYS1kZWNsYXJhdGl2ZSIsayYmaD8idG9wIj09PXE/IiBhLW1vZGFsLWNsb3NlLW5vaGVhZC10b3AiOiIgYS1idXR0b24tdG9wLXJpZ2h0IjoiIiwnIiBhcmlhLWxhYmVsXHgzZCInLGwsJyJceDNlXHgzY2kgY2xhc3NceDNkImEtaWNvbiBhLWljb24tY2xvc2UiXHgzZVx4M2MvaVx4M2VceDNjL2J1dHRvblx4M2UnXS5qb2luKCIiKTtkPWg/IiI6WydceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItaGVhZGVyIlx4M2UnLGssJ1x4M2NoNCBjbGFzc1x4M2QiYS1wb3BvdmVyLWhlYWRlci1jb250ZW50JysKKGU/IiBhLXBvcG92ZXItZHJhZ2dhYmxlLWhhbmRsZSI6IiIpKyciIGlkXHgzZCJhLXBvcG92ZXItaGVhZGVyLScsYSwnIlx4M2UnLGQsIlx4M2MvaDRceDNlXHgzYy9kaXZceDNlIl0uam9pbigiIik7Zz1nP1snXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWZvb3RlciJceDNlJyxnLCJceDNjL2Rpdlx4M2UiXS5qb2luKCIiKToiIjtyPSJub25lIj09PXI/IiBhLXBhZGRpbmctbm9uZSI6IiI7cmV0dXJuW2U/IiI6J1x4M2NkaXYgY2xhc3NceDNkImEtbW9kYWwtc2Nyb2xsZXIgYS1kZWNsYXJhdGl2ZSIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1mbG9hdGluZy1jbG9zZSJceDNlJywnXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyIGEtcG9wb3Zlci1tb2RhbCBhLWRlY2xhcmF0aXZlJysoZT8iIGEtbW9kYWwtbW9kZWxlc3MiOiIgIikrJyIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1hMTF5Ilx4M2UnLGMuZ2V0U3RhcnRBbmNob3JIdG1sKHUpLCdceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItd3JhcHBlciJceDNlJywKZCxoP2s6IiIsJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3Zlci1pbm5lcicsciwnIiBpZFx4M2QiYS1wb3BvdmVyLWNvbnRlbnQtJyxhLCciXHgzZVx4M2MvZGl2XHgzZScsZywiXHgzYy9kaXZceDNlIixjLmdldEVuZEFuY2hvckh0bWwodSksIlx4M2MvZGl2XHgzZSIsZT8iIjoiXHgzYy9kaXZceDNlIl0uam9pbigiIil9fSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWxpZ2h0Ym94IiwiYS1wb3BvdmVyLW9wdGlvbmFsLWhlbHBlcnMiKS5yZWdpc3RlcigiYS1tb2RhbC1wb3NpdGlvbnMiLGZ1bmN0aW9uKGIsZCxnKXtmdW5jdGlvbiBjKGEpe3ZhciBiPWEuJHBvcG92ZXIuY2xvc2VzdCgiLmEtbW9kYWwtc2Nyb2xsZXIiKTtiLnNjcm9sbFRvcCgwKS5jc3MoInZpc2liaWxpdHkiLCJ2aXNpYmxlIik7Yi5iaW5kKCJzY3JvbGwiLGZ1bmN0aW9uKCl7YS51cGRhdGVDaGlsZHJlblBvc2l0aW9uKCl9KX1mdW5jdGlvbiBrKCl7dmFyIGE9Yi52aWV3cG9ydCgpOzI8CmEud2lkdGgvYS5oZWlnaHQmJmIuZGVsYXkoZnVuY3Rpb24oKXtkb2N1bWVudC5hY3RpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KCk7dC5zY3JvbGxUbyh0LnBhZ2VYT2Zmc2V0LDApfSwwKX1mdW5jdGlvbiBmKGEsYixjKXtpZigwPmEpcmV0dXJuIGMoeyJwYWRkaW5nLXJpZ2h0IjpiKyJweCIsImJveC1zaXppbmciOiJjb250ZW50LWJveCJ9KSwhMDtjKHsicGFkZGluZy1yaWdodCI6IiIsImJveC1zaXppbmciOiIifSk7cmV0dXJuITF9ZnVuY3Rpb24gYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5jc3MoYil9fXZhciBtPWIuJCxoPWIuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXMmJmIuY2FwYWJpbGl0aWVzLm1vYmlsZSxuPTA7bC53aGVuKCJwcnY6c2tpbi12YXJzIikuZXhlY3V0ZShmdW5jdGlvbihhKXtuPWEucG9wb3Zlci5vcHRpb25hbEJ1dHRvbkhlaWdodH0pO2wuZGVjbGFyZSgicHJ2OmEtbW9kZWwtYXBwbHlIb3Jpem9uYWxTY3JvbGxTdHlsZXMiLGYpO3JldHVybntpbm5lclNjcm9sbDp7cG9zaXRpb25TdHJhdGVneTpmdW5jdGlvbihjKXt2YXIgbD0KYy5wb3BvdmVyLHY9Yy4kcG9wb3ZlcixxPWMuJHRyaWdnZXIsdT12LmZpbmQoIi5hLXBvcG92ZXItaW5uZXIiKS5jc3MoImhlaWdodCIsImF1dG8iKSxyPXYuY2xvc2VzdCgiLmEtbW9kYWwtc2Nyb2xsZXIiKSx3PXt9LHg9Yi52aWV3cG9ydCghMCksej0uMSp4LmhlaWdodCx5PS4wNSp4LndpZHRoLHg9LjgqeC5oZWlnaHQsQT1sLmF0dHJzKCJoZWlnaHQiKSxsPWwuYXR0cnMoIm1pbi1oZWlnaHQiKTt2LmNzcyh7aGVpZ2h0OkE/QToiIiwibWluLWhlaWdodCI6bD9sOiIifSk7cT1jLm1lYXN1cmUodixxKTt3LmxlZnQ9KHEud2luZG93V2lkdGgtcS5wb3BvdmVyV2lkdGgpLzI7Zih3LmxlZnQseSxhKHYpKSYmKHcubGVmdD15KTtnLmV2YWx1YXRlQWN0dWFsSGVpZ2h0KGMscS5wb3BvdmVySGVpZ2h0LG4pPng/KGw9di5maW5kKCIuYS1wb3BvdmVyLWhlYWRlciwgLmEtbW9kYWwtY2xvc2Utbm9oZWFkLXRvcCIpLm91dGVySGVpZ2h0KCEwKXx8MCxBPXYuZmluZCgiLmEtcG9wb3Zlci1mb290ZXIiKS5vdXRlckhlaWdodCghMCl8fAowLGM9Zy5nZXRPZmZzZXRUb3BEZWx0YShjLHosbikseC09Yyx6Kz1jLHUuY3NzKHtoZWlnaHQ6eC1sLUErInB4Iiwib3ZlcmZsb3cteSI6ImF1dG8ifSksdi5jc3Moe2hlaWdodDp4LCJtaW4taGVpZ2h0IjowfSksdy50b3A9eik6KHcudG9wPShxLndpbmRvd0hlaWdodC1xLnBvcG92ZXJIZWlnaHQpLzIsdS5jc3MoImhlaWdodCIsImF1dG8iKSk7dy5sZWZ0Kz1xLnpvb21MZWZ0O3cudG9wKz1xLnpvb21Ub3A7aCYmKHIuY3NzKCJ0b3AiLG0odCkuc2Nyb2xsVG9wKCkpLHYucmVtb3ZlQ2xhc3MoImEtcG9wb3Zlci1wYW4teSIpLmFkZENsYXNzKCJhLXBvcG92ZXItcGFuLXgiKSx2PW0oZG9jdW1lbnQpLmhlaWdodCgpLHU9bShkb2N1bWVudCkud2lkdGgoKSxtKCIjIitkLkxJR0hUQk9YX0lEKS5jc3Moe2hlaWdodDp2LHdpZHRoOnU+cS5wb3BvdmVyV2lkdGg/dTpxLnBvcG92ZXJXaWR0aCt5fSkpO2IuY2FwYWJpbGl0aWVzLmlzTWV0cm9JRUd1ZXNzJiZiLmNhcGFiaWxpdGllcy5pc0lFVG91Y2hDYXBhYmxlJiYKaygpO3JldHVybiB3fSxiZWZvcmVTaG93TWV0aG9kOmIuY29uc3RhbnRzLk5PT1AsYmVmb3JlSGlkZU1ldGhvZDpiLmNvbnN0YW50cy5OT09QfSxtb2RhbFNjcm9sbDp7cG9zaXRpb25TdHJhdGVneTpmdW5jdGlvbihjKXt2YXIgZD1jLiRwb3BvdmVyLGc9Yy4kdHJpZ2dlcixoPWQuY2xvc2VzdCgiLmEtbW9kYWwtc2Nyb2xsZXIiKSxtPWQuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmNzcygiaGVpZ2h0IiwiYXV0byIpO2lmKGQuaGFzQ2xhc3MoImEtcG9wb3Zlci1tb2RhbC1maXhlZC1oZWlnaHQiKSl7dmFyIGw9ZC5maW5kKCIuYS1wb3BvdmVyLWZvb3RlciIpO20uY3NzKCJwYWRkaW5nLWJvdHRvbSIsbC5oZWlnaHQoKSsxNSl9dmFyIG09e30sbj1iLnZpZXdwb3J0KCEwKSx0PW4uaGVpZ2h0LGw9LjEqdCxuPS4wNSpuLndpZHRoLHQ9LjgqdCx6PWQuaGVpZ2h0KCkseT1kLndpZHRoKCk7Yz1jLm1lYXN1cmUoZCxnKTttLmxlZnQ9KGMud2luZG93V2lkdGgteSkvMjttLnRvcD0oYy53aW5kb3dIZWlnaHQtCnopLzI7ZihtLmxlZnQsbixhKGQpKSYmKG0ubGVmdD1uKTt6PnQ/aC5sZW5ndGg/KG0udG9wPTAsZC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbWFyZ2luOmMuem9vbVRvcCtsKyJweCAwICIrbCsicHggIisoYy56b29tTGVmdCttLmxlZnQpKyJweCJ9KSxtLmxlZnQ9MCxoLmNzcygicGFkZGluZy1ib3R0b20iLCIxcHgiKSk6ej50JiYobS50b3A9cGFkZGluZyk6aC5sZW5ndGgmJihkLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixtYXJnaW46IjBweCJ9KSxoLmNzcygicGFkZGluZy1ib3R0b20iLCIwcHgiKSk7bS5sZWZ0Kz1jLnpvb21MZWZ0O20udG9wKz1jLnpvb21Ub3A7Yi5jYXBhYmlsaXRpZXMuaXNNZXRyb0lFR3Vlc3MmJmIuY2FwYWJpbGl0aWVzLmlzSUVUb3VjaENhcGFibGUmJmsoKTtyZXR1cm4gbX0sYmVmb3JlU2hvd01ldGhvZDpmdW5jdGlvbigpe2ModGhpcyl9LGJlZm9yZUhpZGVNZXRob2Q6ZnVuY3Rpb24oKXt0aGlzLiRwb3BvdmVyLmNsb3Nlc3QoIi5hLW1vZGFsLXNjcm9sbGVyIikuY3NzKCJ2aXNpYmlsaXR5IiwKImhpZGRlbiIpLnVuYmluZCgic2Nyb2xsIil9fSx1dGlsOntkZXRlcm1pbmVNYXhpbXVtSW5uZXJIZWlnaHQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS4kcG9wb3ZlcjthPS44KmIudmlld3BvcnQoKS5oZWlnaHQ7dmFyIGQ9Yy5maW5kKCIuYS1wb3BvdmVyLWhlYWRlciwgLmEtbW9kYWwtY2xvc2Utbm9oZWFkLXRvcCIpLm91dGVySGVpZ2h0KCEwKXx8MCxjPWMuZmluZCgiLmEtcG9wb3Zlci1mb290ZXIiKS5vdXRlckhlaWdodCghMCl8fDA7cmV0dXJuIGEtZC1jfSxkZXRlcm1pbmVJbm5lclZlcnRpY2FsUGFkZGluZzpmdW5jdGlvbihhKXthPWEuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpO3JldHVybiBhLm91dGVySGVpZ2h0KCktYS5oZWlnaHQoKX19fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IiwiYS1tb2RhbC12aWV3IiwiYS1wb3BvdmVyLXV0aWwiKS5yZWdpc3RlcigiYS1tb2RhbC1mYWN0b3J5IixmdW5jdGlvbihiLGQsCmcsYyl7ZnVuY3Rpb24gayhrLGgpe3ZhciBsPSExLGU9ITE7Yi5jYXBhYmlsaXRpZXMubW9iaWxlfHxiLmNhcGFiaWxpdGllcy50YWJsZXR8fChsPWMuZ2V0Qm9vbChoLm1vZGVsZXNzKSxlPWMuZ2V0Qm9vbChoLmRyYWdnYWJsZSkpO2g9e21vZGVsZXNzOmwsZHJhZ2dhYmxlOmUsdHlwZToibW9kYWwiLGFsb25lOiEwLGltbWVyc2l2ZTohMCxwb3NpdGlvbjoid2luZG93Q2VudGVyIixoZWFkZXI6aC5oZWFkZXIsaGlkZUhlYWRlcjpoLmhpZGVIZWFkZXIsZm9vdGVyOmguZm9vdGVyLHBhZGRpbmc6aC5wYWRkaW5nLHdpZHRoOmgud2lkdGgsaGVpZ2h0OmguaGVpZ2h0LCJtYXgtd2lkdGgiOmhbIm1heC13aWR0aCJdLCJtYXgtaGVpZ2h0IjpoWyJtYXgtaGVpZ2h0Il0sIm1pbi13aWR0aCI6aFsibWluLXdpZHRoIl0sIm1pbi1oZWlnaHQiOmhbIm1pbi1oZWlnaHQiXSxjbG9zZUJ1dHRvbjpjLmdldEJvb2woaC5jbG9zZUJ1dHRvbiwhMCksdGltZW91dDpoLnRpbWVvdXQsbGlnaHRib3hPcHRpb25zOmw/CnZvaWQgMDp7bG9ja1Njcm9sbDohMCxzaG93RHVyYXRpb246Znx8YT8wOm51bGx9LGRhdGE6aC5kYXRhfHx7fSxkYXRhU3RyYXRlZ3k6aC5kYXRhU3RyYXRlZ3ksdXJsOmgudXJsLG1hbnVhbFJlZnJlc2g6ISFoLm1hbnVhbFJlZnJlc2gsYWpheEZhaWxNc2c6aC5hamF4RmFpbE1zZyxjYWNoZTpjLmdldEJvb2woaC5jYWNoZSwhMCksaW5saW5lQ29udGVudDpoLmlubGluZUNvbnRlbnQ/aC5pbmxpbmVDb250ZW50OmguY29udGVudCxuYW1lOmgubmFtZSxjbG9zZUJ1dHRvbkxhYmVsOmguY2xvc2VCdXR0b25MYWJlbD9oLmNsb3NlQnV0dG9uTGFiZWw6IkNsb3NlIixoaWRlSGVhZGVyQ2xvc2VCdXR0b25MYXlvdXQ6aC5oaWRlSGVhZGVyQ2xvc2VCdXR0b25MYXlvdXQscG9wb3ZlckxhYmVsOmgucG9wb3ZlckxhYmVsLGFyaWFEZXNjcmlwdGlvbjpoLmFyaWFEZXNjcmlwdGlvbixsZWdhY3lOYXZpZ2FibGU6Yy5nZXRCb29sKGgubGVnYWN5TmF2aWdhYmxlLCEwKX07cmV0dXJuIGQuY3JlYXRlKGssCnthdHRyaWJ1dGVzOmgsdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KX12YXIgZj0tMTxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoImEtbHQtaWU5IiksYT1iLmNhcGFiaWxpdGllcy5tb2JpbGUmJmIuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXM7cmV0dXJue3R5cGU6Im1vZGFsIixjcmVhdGU6ayxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ZC5nZXQoYSwibW9kYWwiKTtifHwib2JqZWN0IiE9PXR5cGVvZiBhfHwoYT1jLmV4dHJhY3REZWNsYXJhdGl2ZVBhcmFtcyhhLCJtb2RhbCIpKSYmKGI9ayhhLiR0cmlnZ2VyLGEuYXR0cmlidXRlc3x8e30pKTtyZXR1cm4gYn0scmVtb3ZlOmZ1bmN0aW9uKGEpe3JldHVybiBkLnJlbW92ZShhLCJtb2RhbCIpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsImEtbW9kYWwtZmFjdG9yeSIsInJlYWR5IikucmVnaXN0ZXIoImEtbW9kYWwtaGFuZGxlcnMiLApmdW5jdGlvbihiLGQsZyl7ZD1iLiQ7Yi5kZWNsYXJhdGl2ZSgiYS1tb2RhbCIsImNsaWNrIixmdW5jdGlvbihiKXtnLmdldChiLiRkZWNsYXJhdGl2ZVBhcmVudCkuc2hvdygpO2IuJGV2ZW50LnByZXZlbnREZWZhdWx0KCl9KTtkKGRvY3VtZW50KS5kZWxlZ2F0ZSgiLmEtbW9kYWwtc2Nyb2xsZXIiLCJjbGljayAiK2IuYWN0aW9uLnN0YXJ0KyIgIitiLmFjdGlvbi5tb3ZlLGZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcyYmYi5wcmV2ZW50RGVmYXVsdCgpfSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1tb2RhbC1mYWN0b3J5IiwiYS1wb3BvdmVyLWJhc2UiLCJhLW1vZGFsLWhhbmRsZXJzIikucmVnaXN0ZXIoImEtbW9kYWwiLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLXV0aWwiLCJhLXBvcG92ZXItYW5pbWF0ZSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItdmlldy1iYXNlIixmdW5jdGlvbihiLGQsZyl7cmV0dXJue3NldEFyaWFCdXN5OmZ1bmN0aW9uKGIpe3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci13cmFwcGVyIikuYXR0cigiYXJpYS1idXN5IiwKYil9LHVwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oYil7InN0cmluZyI9PT10eXBlb2YgYj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItY29udGVudCIpLmh0bWwoYik6YiYmdGhpcy4kcG9wb3Zlci5maW5kKCIuYS1wb3BvdmVyLWNvbnRlbnQiKS5odG1sKCIiKS5hcHBlbmQoYil9LHVwZGF0ZURpbWVuc2lvbnM6ZnVuY3Rpb24oKXt0aGlzLiRwb3BvdmVyLmNzcyhkLmdldENTU0hhc2godGhpcy5hdHRycygpKSk7dGhpcy5pc0FjdGl2ZSgpJiZ0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7cmV0dXJuIHRoaXN9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9wb3Zlcj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItY29udGVudCIpOm51bGx9LGhpZGVNZXRob2Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcztnLmZhZGVPdXQoZCwyNTAsImxpbmVhciIsZnVuY3Rpb24oKXtkLiRwb3BvdmVyLmNzcyh7dG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pO2IuY2FsbChkKX0pfX19KTsKbC53aGVuKCJhLXV0aWwiKS5yZWdpc3RlcigiYS1wb3BvdmVyLW9wdGlvbmFsLWhlbHBlcnMiLGZ1bmN0aW9uKGIpe3JldHVybntnZXRPZmZzZXRUb3BEZWx0YTpmdW5jdGlvbihkLGcsYyl7Yz1wYXJzZUZsb2F0KGMpO3ZhciBrPWIuaXNGaW5pdGVOdW1iZXIoYykmJjA8YztkPWQuJHBvcG92ZXIuZmluZCgiLmEtYnV0dG9uLWNsb3NlIikubGVuZ3RoJiYhZC4kcG9wb3Zlci5maW5kKCIuYS1idXR0b24tY2xvc2UtYTExeSIpLmxlbmd0aDtyZXR1cm4gayYmZCYmMD5nLWM/Yy1nOjB9LGV2YWx1YXRlQWN0dWFsSGVpZ2h0OmZ1bmN0aW9uKGIsZyxjKXtyZXR1cm4gYi4kcG9wb3Zlci5maW5kKCIuYS1idXR0b24tY2xvc2UiKS5sZW5ndGgmJiFiLiRwb3BvdmVyLmZpbmQoIi5hLWJ1dHRvbi1jbG9zZS1hMTF5IikubGVuZ3RoP2crYzpnfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLXZpZXctYmFzZSIsImEtcG9wb3Zlci11dGlsIiwiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHkiKS5yZWdpc3RlcigiYS1wb3BvdmVyLXZpZXciLApmdW5jdGlvbihiLGQsZyxjKXt2YXIgaz0hMDtsLndoZW4oInBydjpza2luLXZhcnMiKS5leGVjdXRlKGZ1bmN0aW9uKGIpe2s9Yi5wb3BvdmVyLmNsb3NlQnV0dG9uRW5hYmxlZH0pO3JldHVybiBiLmV4dGVuZChkLHtza2luOmZ1bmN0aW9uKGIpe3ZhciBhPWIuYXR0cnMoImlkIiksZD1iLmF0dHJzKCJoZWFkZXIiKSxnPWsmJmIuYXR0cnMoImNsb3NlQnV0dG9uIiksbD1iLmF0dHJzKCJjbG9zZUJ1dHRvbkxhYmVsIik/Yi5hdHRycygiY2xvc2VCdXR0b25MYWJlbCIpOiIiLGU9Yi5hdHRycygicG9wb3ZlckxhYmVsIik/Yi5hdHRycygicG9wb3ZlckxhYmVsIik6IiIscD1iLmF0dHJzKCJhcmlhRGVzY3JpcHRpb24iKSx0PWIuYXR0cnMoInBhZGRpbmciKTtiPWIuYXR0cnMoInBvcG92ZXJBcnJvdyIpO2U9e2lkOmEsaGVhZGVyX3N0cjpkLGxhYmVsX3N0cjplLGFyaWFfZGVzY3JpcHRpb246cH07Zz0nXHgzY2J1dHRvbiBkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWNsb3NlIiBjbGFzc1x4M2QiYS1idXR0b24tY2xvc2UgJysKKGc/IiI6ImEtYnV0dG9uLWNsb3NlLWExMXkiKSsnIGEtZGVjbGFyYXRpdmUiIGFyaWEtbGFiZWxceDNkIicrbCsnIlx4M2VceDNjaSBjbGFzc1x4M2QiYS1pY29uIGEtaWNvbi1jbG9zZSJceDNlXHgzYy9pXHgzZVx4M2MvYnV0dG9uXHgzZSc7ZD0obD1kJiYiIiE9PWQpP1snXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWhlYWRlciJceDNlJyxnLCdceDNjaDQgY2xhc3NceDNkImEtcG9wb3Zlci1oZWFkZXItY29udGVudCIgaWRceDNkImEtcG9wb3Zlci1oZWFkZXItJyxhLCciXHgzZScsZCwiXHgzYy9oNFx4M2VceDNjL2Rpdlx4M2UiXS5qb2luKCIiKToiIjt0PSJub25lIj09PXQ/IiBhLXBhZGRpbmctbm9uZSI6IiI7Yj1iPydceDNjZGl2IGNsYXNzXHgzZCJhLWFycm93LWJvcmRlciJceDNlXHgzY2RpdiBjbGFzc1x4M2QiYS1hcnJvdyJceDNlXHgzYy9kaXZceDNlXHgzYy9kaXZceDNlJzoiIjtyZXR1cm5bJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3ZlciAnLGw/ImEtcG9wb3Zlci1oYXMtaGVhZGVyIjoKImEtcG9wb3Zlci1uby1oZWFkZXIiLCcgYS1kZWNsYXJhdGl2ZSIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1jb250YWluZXIgYS1wb3BvdmVyLWExMXkiXHgzZScsYy5nZXRTdGFydEFuY2hvckh0bWwoZSksJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3Zlci13cmFwcGVyIlx4M2UnLGQsJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3Zlci1pbm5lcicsdCwnIlx4M2UnLCIiPT09ZD9nOiIiLCdceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItY29udGVudCIgaWRceDNkImEtcG9wb3Zlci1jb250ZW50LScsYSwnIlx4M2VceDNjL2Rpdlx4M2VceDNjL2Rpdlx4M2UnLGIsIlx4M2MvZGl2XHgzZSIsYy5nZXRFbmRBbmNob3JIdG1sKGUpLCJceDNjL2Rpdlx4M2UiXS5qb2luKCIiKX19KX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IiwiYS1wb3BvdmVyLXZpZXciLCJhLXBvcG92ZXItdXRpbCIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItZmFjdG9yeSIsCmZ1bmN0aW9uKGIsZCxnLGMpe2Z1bmN0aW9uIGsoYixhKXthPXt0eXBlOiJwb3BvdmVyIixhbG9uZTohMCxoZWFkZXI6YS5oZWFkZXIsd2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHQsIm1heC13aWR0aCI6YVsibWF4LXdpZHRoIl0sIm1heC1oZWlnaHQiOmFbIm1heC1oZWlnaHQiXSwibWluLXdpZHRoIjphWyJtaW4td2lkdGgiXSwibWluLWhlaWdodCI6YVsibWluLWhlaWdodCJdLHBhZGRpbmc6YS5wYWRkaW5nLGNsb3NlQnV0dG9uOmMuZ2V0Qm9vbChhLmNsb3NlQnV0dG9uLCEwKSxwb3NpdGlvbjphLnBvc2l0aW9ufHwidHJpZ2dlclZlcnRpY2FsIixhY3RpdmF0ZTphLmFjdGl2YXRlfHwib25tb3VzZW92ZXIiLHRpbWVvdXQ6YS50aW1lb3V0LGRhdGE6YS5kYXRhfHx7fSxkYXRhU3RyYXRlZ3k6YS5kYXRhU3RyYXRlZ3ksdXJsOmEudXJsLG1hbnVhbFJlZnJlc2g6ISFhLm1hbnVhbFJlZnJlc2gsYWpheEZhaWxNc2c6YS5hamF4RmFpbE1zZyxjYWNoZTpjLmdldEJvb2woYS5jYWNoZSwKITApLGlubGluZUNvbnRlbnQ6YS5pbmxpbmVDb250ZW50P2EuaW5saW5lQ29udGVudDphLmNvbnRlbnQsbmFtZTphLm5hbWUsY2xvc2VCdXR0b25MYWJlbDphLmNsb3NlQnV0dG9uTGFiZWw/YS5jbG9zZUJ1dHRvbkxhYmVsOiJDbG9zZSIscG9wb3ZlckxhYmVsOmEucG9wb3ZlckxhYmVsLGFyaWFEZXNjcmlwdGlvbjphLmFyaWFEZXNjcmlwdGlvbixmb2N1c1doZW5TaG93bjpjLmdldEJvb2woYS5mb2N1c1doZW5TaG93biwhMCkscG9wb3ZlckFycm93OmMuZ2V0Qm9vbChhLnBvcG92ZXJBcnJvdywhMCkscmVzdG9yZUZvY3VzT25IaWRlOmMuZ2V0Qm9vbChhLnJlc3RvcmVGb2N1c09uSGlkZSwhMCl9O3JldHVybiBkLmNyZWF0ZShiLHthdHRyaWJ1dGVzOmEsdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KX1yZXR1cm57dHlwZToicG9wb3ZlciIsY3JlYXRlOmssZ2V0OmZ1bmN0aW9uKGIpe3ZhciBhPWQuZ2V0KGIsInBvcG92ZXIiKTthfHwib2JqZWN0IiE9PXR5cGVvZiBifHwKKGI9Yy5leHRyYWN0RGVjbGFyYXRpdmVQYXJhbXMoYiwicG9wb3ZlciIpKSYmKGE9ayhiLiR0cmlnZ2VyLGIuYXR0cmlidXRlc3x8e30pKTtyZXR1cm4gYX0scmVtb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiBkLnJlbW92ZShiLCJwb3BvdmVyIil9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItZmFjdG9yeSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItaGFuZGxlcnMiLGZ1bmN0aW9uKGIsZCl7ZnVuY3Rpb24gZyhhKXthJiYhYS5kZXN0cm95VGltZXImJihhLmRlc3Ryb3lUaW1lcj1iLmRlbGF5KGZ1bmN0aW9uKCl7YS5oaWRlKCl9LDI1MCkpfWZ1bmN0aW9uIGMoYSl7YSYmKGNsZWFyVGltZW91dChhLmRlc3Ryb3lUaW1lciksYS5kZXN0cm95VGltZXI9bnVsbCxjbGVhclRpbWVvdXQoYS5wYXJlbnQuZGVzdHJveVRpbWVyKSxhLnBhcmVudC5kZXN0cm95VGltZXI9bnVsbCl9dmFyIGs9Yi4kLGY9IShiLmNhcGFiaWxpdGllcy5tb2JpbGV8fGIuY2FwYWJpbGl0aWVzLnRhYmxldCkmJgpiLmNhcGFiaWxpdGllcy5pb3M7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyIiwiY2xpY2siLGZ1bmN0aW9uKGEpe3ZhciBiPWQuZ2V0KGEuJGRlY2xhcmF0aXZlUGFyZW50KTtiJiYoIm9uY2xpY2siPT09Yi5hdHRycygiYWN0aXZhdGUiKXx8ZikmJihiLnNob3coKSxhLiRldmVudC5wcmV2ZW50RGVmYXVsdCgpKX0pO2IuZGVjbGFyYXRpdmUoImEtcG9wb3ZlciIsImtleWRvd24iLGZ1bmN0aW9uKGEpe3ZhciBjPWIuY29uc3RhbnRzLmtleWNvZGVzLGc9YS4kZXZlbnQud2hpY2g7aWYoZz09PWMuRU5URVJ8fGc9PT1jLlNQQUNFKWEuJGV2ZW50LnByZXZlbnREZWZhdWx0KCksZC5nZXQoYS4kZGVjbGFyYXRpdmVQYXJlbnQpLnNob3coKX0pO2lmKCFmKXt2YXIgYTtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXIiLCJtb3VzZWVudGVyIixmdW5jdGlvbihnKXt2YXIgaD1kLmdldChnLiRkZWNsYXJhdGl2ZVBhcmVudCk7aCYmIm9ubW91c2VvdmVyIj09PWguYXR0cnMoImFjdGl2YXRlIikmJihjKGgpLAphPWIuZGVsYXkoZnVuY3Rpb24oKXsoaD1kLmdldChnLiRkZWNsYXJhdGl2ZVBhcmVudCkpJiZoLnNob3coKX0sMjAwKSl9KTtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXIiLCJtb3VzZW1vdmUiLGZ1bmN0aW9uKGEpezI+Yi5jdXJzb3IoKS5zcGVlZCYmKGE9ZC5nZXQoYS4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWEuYXR0cnMoImFjdGl2YXRlIikmJmEuc2hvdygpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyIiwibW91c2VsZWF2ZSIsZnVuY3Rpb24oYil7KGI9ZC5nZXQoYi4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWIuYXR0cnMoImFjdGl2YXRlIikmJihnKGIpLGEmJmNsZWFyVGltZW91dChhKSl9KTtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXItY29udGFpbmVyIiwibW91c2VlbnRlciIsZnVuY3Rpb24oYSl7KGE9ZC5nZXQoYS4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWEuYXR0cnMoImFjdGl2YXRlIikmJgpjKGEpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyLWNvbnRhaW5lciIsIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKGEpe3ZhciBjPWQuZ2V0KGEuJGRlY2xhcmF0aXZlUGFyZW50KSxmPSEwLGU9ayhhLiRldmVudC5yZWxhdGVkVGFyZ2V0KTtjJiYib25tb3VzZW92ZXIiPT09Yy5hdHRycygiYWN0aXZhdGUiKSYmYy5pc0FjdGl2ZSgpJiYoYi5lYWNoKGMuY2hpbGRyZW4sZnVuY3Rpb24oYSl7aWYoZS5jbG9zZXN0KGEuJHBvcG92ZXIpLmxlbmd0aClyZXR1cm4gZj0hMX0pLGYmJihnKGMpLGMucGFyZW50LmltbWVyc2l2ZXx8MCE9PWUuY2xvc2VzdChjLnBhcmVudC4kcG9wb3ZlcikubGVuZ3RofHxnKGMucGFyZW50KSkpfSl9fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci1mYWN0b3J5IiwiYS1wb3BvdmVyLWJhc2UiLCJhLXBvcG92ZXItaGFuZGxlcnMiKS5yZWdpc3RlcigiYS1wb3BvdmVyIixmdW5jdGlvbihiLGQpe3JldHVybiBkfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsCiJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IiwiYS1zZWNvbmRhcnktdmlldy12aWV3IiwiYS1wb3BvdmVyLXV0aWwiKS5yZWdpc3RlcigiYS1zZWNvbmRhcnktdmlldy1mYWN0b3J5IixmdW5jdGlvbihiLGQsZyxjKXtmdW5jdGlvbiBrKGMsZil7Zi5kaXNhYmxlQW5pbWF0aW9uPWYuZGlzYWJsZUFuaW1hdGlvbnx8Yi5jYXBhYmlsaXRpZXMuaXNPbGRBbmRyb2lkO3JldHVybiBkLmNyZWF0ZShjLHthdHRyaWJ1dGVzOnt0eXBlOiJzZWNvbmRhcnktdmlldyIsaW1tZXJzaXZlOiEwLGRpc2FibGVBbmltYXRpb246YXx8Zi5kaXNhYmxlQW5pbWF0aW9uLHN5bmNocm9ub3VzOiEhKGF8fGYuc3luY2hyb25vdXMmJiJmYWxzZSIhPT1mLnN5bmNocm9ub3VzKSxhbmltYXRpb25MZW5ndGg6Zi5kaXNhYmxlQW5pbWF0aW9uPzA6MzAwLGFsdGVybmF0ZUJhY2tncm91bmQ6Zi5hbHRlcm5hdGVCYWNrZ3JvdW5kfHwhMSxoaWRlSGVhZGVyOmF8fGYuaGlkZUhlYWRlcnx8ITEsc2Nyb2xsYWJsZTpmLnNjcm9sbGFibGV8fAohMCxoZWFkZXI6Zi5oZWFkZXIsYmFja0J1dHRvblRleHQ6Zi5iYWNrQnV0dG9uVGV4dCxwb3NpdGlvbjoid2luZG93RnVsbFdpZHRoIix0aW1lb3V0OmYudGltZW91dCxkYXRhU3RyYXRlZ3k6Zi5kYXRhU3RyYXRlZ3ksaW5saW5lQ29udGVudDpmLmlubGluZUNvbnRlbnQ/Zi5pbmxpbmVDb250ZW50OmYuY29udGVudCx1cmw6Zi51cmwsbWFudWFsUmVmcmVzaDohIWYubWFudWFsUmVmcmVzaCxuYW1lOmYubmFtZSxjYWNoZToiZmFsc2UiPT09Zi5jYWNoZXx8ITE9PT1mLmNhY2hlPyExOiEwLGRhdGE6Zi5kYXRhfHx7fSxwb3BvdmVyTGFiZWw6Zi5wb3BvdmVyTGFiZWwscGFkZGluZzpmLnBhZGRpbmcsYXJpYURlc2NyaXB0aW9uOmYuYXJpYURlc2NyaXB0aW9uLGhpc3RvcnlBcGk6InRydWUiPT09Zi5oaXN0b3J5QXBpfHwhMD09PWYuaGlzdG9yeUFwaX0sdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KX12YXIgZj1iLiQsYT0hMTtsLndoZW4oIm1hc2gtd2lsbC1sb2FkIikuZXhlY3V0ZShmdW5jdGlvbigpe2E9CiEwfSk7cmV0dXJue3R5cGU6InNlY29uZGFyeS12aWV3IixjcmVhdGU6ayxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ZC5nZXQoYSwic2Vjb25kYXJ5LXZpZXciKTtpZighYiYmIm9iamVjdCI9PT10eXBlb2YgYSl7dmFyIGc9Yy5leHRyYWN0RGVjbGFyYXRpdmVQYXJhbXMoYSwic2Vjb25kYXJ5LXZpZXciKTtnJiYoYj1rKGcuJHRyaWdnZXIsZy5hdHRyaWJ1dGVzfHx7fSkpfWImJiJvYmplY3QiPT09dHlwZW9mIGEmJihhPWYoYSksYT0oYT1hLmhhc0NsYXNzKCJhLWRlY2xhcmF0aXZlIik/YTphLmZpbmQoIi5hLWRlY2xhcmF0aXZlIikuZXEoMCkpP2EuZGF0YSgiYS1zZWNvbmRhcnktdmlldyIpOm51bGwsYi5kYXRhPWEuZGF0YSk7cmV0dXJuIGJ9LHJlbW92ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5yZW1vdmUoYSwic2Vjb25kYXJ5LXZpZXciKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtc2Vjb25kYXJ5LXZpZXctZmFjdG9yeSIsImEtcG9wb3Zlci1iYXNlIiwiYS1zZWNvbmRhcnktdmlldy1oYW5kbGVycyIpLnJlZ2lzdGVyKCJhLXNlY29uZGFyeS12aWV3IiwKZnVuY3Rpb24oYixkKXtyZXR1cm4gZH0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItYW5pbWF0ZSIpLnJlZ2lzdGVyKCJhLXRvb2x0aXAtdmlldy1iYXNlIixmdW5jdGlvbihiLGQpe3JldHVybnt1cGRhdGVDb250ZW50OmZ1bmN0aW9uKGIpe3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtdG9vbHRpcC1pbm5lciIpLmh0bWwoYil9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9wb3Zlcj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXRvb2x0aXAtaW5uZXIiKTpudWxsfSxoaWRlTWV0aG9kOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7ZC5mYWRlT3V0KGMsMjUwLCJsaW5lYXIiLGZ1bmN0aW9uKCl7Yi5jYWxsKGMpfSl9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXRvb2x0aXAtdmlldy1iYXNlIikucmVnaXN0ZXIoImEtdG9vbHRpcC12aWV3IixmdW5jdGlvbihiLGQpe3JldHVybiBiLmV4dGVuZChkLHtza2luOmZ1bmN0aW9uKGIpe3JldHVyblsnXHgzY2RpdiByb2xlXHgzZCJ0b29sdGlwIiBjbGFzc1x4M2QiYS1wb3BvdmVyIGEtdG9vbHRpcCBhLWRlY2xhcmF0aXZlIiBkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWNsb3NlIlx4M2VceDNjZGl2IGNsYXNzXHgzZCJhLXRvb2x0aXAtaW5uZXIiXHgzZVx4M2MvZGl2XHgzZScsCmIuYXR0cnMoInBvcG92ZXJBcnJvdyIpPydceDNjZGl2IGNsYXNzXHgzZCJhLWFycm93LWJvcmRlciJceDNlXHgzY2RpdiBjbGFzc1x4M2QiYS1hcnJvdyJceDNlXHgzYy9kaXZceDNlXHgzYy9kaXZceDNlJzoiIiwiXHgzYy9kaXZceDNlIl0uam9pbigiIil9fSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsImEtdG9vbHRpcC12aWV3IiwiYS1wb3BvdmVyLXV0aWwiKS5yZWdpc3RlcigiYS10b29sdGlwLWZhY3RvcnkiLGZ1bmN0aW9uKGIsZCxnLGMpe2Z1bmN0aW9uIGsoYixhKXthPXt0eXBlOiJ0b29sdGlwIixuYW1lOmEubmFtZSxpbmxpbmVDb250ZW50OmEuaW5saW5lQ29udGVudD9hLmlubGluZUNvbnRlbnQ6YS5jb250ZW50LHBvc2l0aW9uOmEucG9zaXRpb258fCJ0cmlnZ2VyVmVydGljYWwiLGFjdGl2YXRlOmEuYWN0aXZhdGV8fCJvbm1vdXNlb3ZlciIscG9wb3ZlckFycm93OmMuZ2V0Qm9vbChhLnBvcG92ZXJBcnJvdywhMCkscmVzdG9yZUZvY3VzT25IaWRlOiExfTsKYT1kLmNyZWF0ZShiLHthdHRyaWJ1dGVzOmEsdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KTtiLmFkZChiLmNoaWxkcmVuKCkpLmZpbHRlcigiYSwgaW5wdXQiKS5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IiwiYS1wb3BvdmVyLSIrYi5kYXRhKCJhLXBvcG92ZXItaWQiKSk7cmV0dXJuIGF9cmV0dXJue3R5cGU6InRvb2x0aXAiLGNyZWF0ZTprLGdldDpmdW5jdGlvbihiKXt2YXIgYT1kLmdldChiLCJ0b29sdGlwIik7YXx8Im9iamVjdCIhPT10eXBlb2YgYnx8KGI9Yy5leHRyYWN0RGVjbGFyYXRpdmVQYXJhbXMoYiwidG9vbHRpcCIpKSYmKGE9ayhiLiR0cmlnZ2VyLGIuYXR0cmlidXRlc3x8e30pKTtyZXR1cm4gYX0scmVtb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiBkLnJlbW92ZShiLCJ0b29sdGlwIil9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXRvb2x0aXAtZmFjdG9yeSIpLnJlZ2lzdGVyKCJhLXRvb2x0aXAtaGFuZGxlcnMiLGZ1bmN0aW9uKGIsCmQpe2IuZGVjbGFyYXRpdmUoImEtdG9vbHRpcCIsImNsaWNrIixmdW5jdGlvbihiKXt2YXIgYz1kLmdldChiLiRkZWNsYXJhdGl2ZVBhcmVudCk7YyYmIm9uY2xpY2siPT09Yy5hdHRycygiYWN0aXZhdGUiKSYmKGMuc2hvdygpLGIuJGV2ZW50LnByZXZlbnREZWZhdWx0KCkpfSk7Yi5kZWNsYXJhdGl2ZSgiYS10b29sdGlwIiwibW91c2VlbnRlciIsZnVuY3Rpb24oYil7KGI9ZC5nZXQoYi4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWIuYXR0cnMoImFjdGl2YXRlIikmJihiLnNob3coKSxiLmRlc3Ryb3lUaW1lciYmKGNsZWFyVGltZW91dChiLmRlc3Ryb3lUaW1lciksYi5kZXN0cm95VGltZXI9bnVsbCkpfSk7Yi5kZWNsYXJhdGl2ZSgiYS10b29sdGlwIiwibW91c2VsZWF2ZSIsZnVuY3Rpb24oZyl7dmFyIGM9ZC5nZXQoZy4kZGVjbGFyYXRpdmVQYXJlbnQpO2MmJiJvbm1vdXNlb3ZlciI9PT1jLmF0dHJzKCJhY3RpdmF0ZSIpJiYoYy5kZXN0cm95VGltZXI9Yi5kZWxheShmdW5jdGlvbigpe2MuaGlkZSgpfSwKMTI1KSl9KTtiLmRlY2xhcmF0aXZlKCJhLXRvb2x0aXAiLCJmb2N1cyBmb2N1c2luIixmdW5jdGlvbihiKXsoYj1kLmdldChiLiRkZWNsYXJhdGl2ZVBhcmVudCkpJiZiLnNob3coKX0pO2IuZGVjbGFyYXRpdmUoImEtdG9vbHRpcCIsImJsdXIgZm9jdXNvdXQiLGZ1bmN0aW9uKGIpeyhiPWQuZ2V0KGIuJGRlY2xhcmF0aXZlUGFyZW50KSkmJmIuaGlkZSgpfSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS10b29sdGlwLWZhY3RvcnkiLCJhLXBvcG92ZXItYmFzZSIsImEtdG9vbHRpcC1oYW5kbGVycyIpLnJlZ2lzdGVyKCJhLXRvb2x0aXAiLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR9KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24oYyl7dmFyIGI9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxkPWIuX25hbWVzcGFjZXx8Yi5hdHRyaWJ1dGVFcnJvcnMsYT1kP2QoIkFtYXpvblVJQm90dG9tU2hlZXQiLCJBbWF6b25VSSIpOmI7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChjKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7YyhhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYixkKXt9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGMpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBbWF6b25VSUNvbXBhdEpTIiwiQW1hem9uVUkiKTpiO2EuZ3VhcmRGYXRhbD9hLmd1YXJkRmF0YWwoYykoYSx3aW5kb3cpOmEuZXhlY3V0ZShmdW5jdGlvbigpe2MoYSx3aW5kb3cpfSl9KShmdW5jdGlvbihjLGIsZCl7fSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihjKXt2YXIgYT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLGQ9YS5fbmFtZXNwYWNlfHxhLmF0dHJpYnV0ZUVycm9ycyxiPWQ/ZCgiQW1hem9uVUkiLCJBbWF6b25VSSIpOmE7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChjKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7YyhiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYSxkKXthLnBjdj1hLnBjdnx8e307YS5wY3YuQW1hem9uVUk9ImY5YTM5NTFkMTA5N2MzOTkyN2VhMTRkODU0OTgyYjYyZmQ2OTkzODUifSk7Ci8qICoqKioqKioqICovCg==
Requested by
Host: www.studiojvd.com
URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
205.151.67.100 Salaberry-de-Valleyfield, Canada, ASN11290 (CC-3272, CA),
Reverse DNS
205-151-67-100.static.cgocable.ca
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash

Request headers

Referer
https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Fri, 24 Jul 2020 22:12:08 GMT
Server
nginx/1.14.0 (Ubuntu)
Connection
close
Content-Length
202
Content-Type
text/html
YXJiPSIrYzsic3RyaW5nIj09PXR5cGVvZiBrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy51ZXQmJndpbmRvdy51ZXQoImJiIixrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlLHt3YjoxfSk7YS5hamF4K...
www.studiojvd.com/wp-content/themes/skanda/new/UC5yZWdpc3RlcigiY3ZmVmVyc2lvbiIsZnVuY3Rpb24oKXtyZXR1cm57dmVyc2lvbjoiMC4xLjAuMC0yMDE3LTExLTExIn19KTsKUC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZW...
0
0
Script
General
Full URL
https://www.studiojvd.com/wp-content/themes/skanda/new/UC5yZWdpc3RlcigiY3ZmVmVyc2lvbiIsZnVuY3Rpb24oKXtyZXR1cm57dmVyc2lvbjoiMC4xLjAuMC0yMDE3LTExLTExIn19KTsKUC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLnJlZ2lzdGVyKCJjdmYtYWNjb3VudC1zd2l0Y2hlciIsZnVuY3Rpb24oYSxsKXtmdW5jdGlvbiBoKGIsZSl7Yi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBkPWwucmV0cmlldmVGb3JtRGF0YShiLnRhcmdldCksZz1kLmlucHV0RGF0YS5zZXJpYWxpemVBcnJheSgpO2cucHVzaChtKGIudGFyZ2V0KSk7YS5hamF4KHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCsiLy8iK3dpbmRvdy5sb2NhdGlvbi5ob3N0K2QucmVxdWVzdFBhdGgse21ldGhvZDoiUE9TVCIscGFyYW1zOmcsc3VjY2VzczplLGVycm9yOm59KX1mdW5jdGlvbiBtKGMpe2M9YihjKTt2YXIgZT1jLmF0dHIoIm5hbWUiKTtlfHwoZT1jLmNsb3Nlc3QoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1saW5rIikuYXR0cigiZGF0YS1uYW1lIikpO3ZhciBkPWMuYXR0cigidmFsdWUiKTtkfHwoZD1jLmNsb3Nlc3QoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1saW5rIikuYXR0cigiZGF0YS12YWx1ZSIpKTsKcmV0dXJue25hbWU6ZSx2YWx1ZTpkfX1mdW5jdGlvbiBuKGIsZSxkKXthLnRyaWdnZXIocC5lcnJvcixkKX1mdW5jdGlvbiBmKGMpe3ZhciBlPS8oW15AXHNdKylAKFthLXpBLVowLTlfLV0rKShcLlthLXpBLVowLTkuXy1dKykvaWcuZXhlYyhjKTtpZihudWxsIT09ZSl7Yz1lWzFdO2M9Yi50cmltKGMpO3ZhciBkPWMubGVuZ3RoO2lmKDEhPT1kKXtmb3IodmFyIGc9Yy5jaGFyQXQoMCksYT0wO2E8ZC0yO2ErKylnKz0iKiI7Yz1nKz1jLmNoYXJBdChkLTEpfWMrPSJAIjtnPWVbMl07Zz1iLnRyaW0oZyk7ZD1nLmxlbmd0aDtnPWcuY2hhckF0KDApO2ZvcihhPTA7YTxkLTE7YSsrKWcrPSIqIjtyZXR1cm4gYytnK2VbM119ZT1iLnRyaW0oYyk7Yz1lLmxlbmd0aDtpZighKDQ+PWMpKXtkPSIiO2ZvcihnPTA7ZzxjLTQ7ZysrKWQrPSIqIjtlPWQrZS5zdWJzdHIoYy00LGMtMSl9cmV0dXJuIGV9ZnVuY3Rpb24gcSgpezA9PT1iKCIuY3ZmLWFjY291bnQtc3dpdGNoZXItY2hlY2stbWFyazp2aXNpYmxlIikubGVuZ3RoJiYKKGIoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1jaGVjay1tYXJrLWFyZWEiKS5yZW1vdmUoKSxiKCIuY3ZmLWFjY291bnQtc3dpdGNoZXItcHJvZmlsZS1kZXRhaWxzIikudG9nZ2xlQ2xhc3MoImN2Zi1hY2NvdW50LXN3aXRjaGVyLXByb2ZpbGUtZGV0YWlscyBjdmYtYWNjb3VudC1zd2l0Y2hlci1wcm9maWxlLWRldGFpbHMtYWZ0ZXItYWNjb3VudC1yZW1vdmVkIikpfXZhciBiPWEuJCxwPXtzdWNjZXNzOiJjdmY6YWNjb3VudF9zd2l0Y2hlcjpzdWNjZXNzIixlcnJvcjoiY3ZmOmFjY291bnRfc3dpdGNoZXI6ZXJyb3IifTsoZnVuY3Rpb24oKXt2YXIgYz1iKCIjYXAtYWNjb3VudC1zd2l0Y2hlci1jb250YWluZXIiKVswXSxhPXdpbmRvdy5NdXRhdGlvbk9ic2VydmVyfHx3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtpZih2b2lkIDAhPT1jJiZ2b2lkIDAhPT1hKXt2YXIgZD1uZXcgYShmdW5jdGlvbihiKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZihudWxsIT09YlthXS5hZGRlZE5vZGVzKXtxKCk7CmQuZGlzY29ubmVjdCgpO2JyZWFrfX0pO2Qub2JzZXJ2ZShjLHthdHRyaWJ1dGVzOiEwLGNoaWxkTGlzdDohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITB9KX19KSgpOyhmdW5jdGlvbigpe2IoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1saW5rIikubGl2ZSgiY2xpY2siLGZ1bmN0aW9uKGMpe2goYyxmdW5jdGlvbihlKXtpZihlLnJlZGlyZWN0VXJsKXdpbmRvdy5sb2NhdGlvbj1lLnJlZGlyZWN0VXJsLGEudHJpZ2dlcigiY3ZmOmFjY291bnRfc3dpdGNoZXIiLCJyZWRpcmVjdE9uU2lnbk91dCIpO2Vsc2UgaWYoZS5zdWNjZWVkZWQpe3ZhciBkPSIuIitiKGMudGFyZ2V0KS5hdHRyKCJjbGFzcyIpLm1hdGNoKC9jdmYtYWNjb3VudC1zd2l0Y2hlci1hY2NvdW50LWdyb3VwLVx3Ky9nKVswXTtiKGQrIi1oaWRlIikuaGlkZSgpO2IoZCsiLW5hbWUiKS50ZXh0KGIoIiNjdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1yZXBsYWNlLXRleHQiKS50ZXh0KCkpO2IoZCsKIi1jbGFpbSIpLnRleHQoZihiKGQrIi1jbGFpbSIpLnRleHQoKSkpO2IoZCsiLWltYWdlIikucmVwbGFjZVdpdGgoYigiPGRpdiAvPiIpLmFwcGVuZChiKCIjY3ZmLWFjY291bnQtc3dpdGNoZXItc2lnbi1vdXQtcmVwbGFjZS1pbWFnZSIpLmNsb25lKCkucmVtb3ZlQ2xhc3MoImN2Zi1oaWRkZW4iKSkuaHRtbCgpKTtiKGQrIi1idXR0b24iKS5yZW1vdmVDbGFzcygiY3ZmLXdpZGdldC1idG4tdmFsIGN2Zi13aWRnZXQtYnRuLXZlcmlmeS1hY2NvdW50LXN3aXRjaGVyIik7ZT1lLnN3aXRjaGVkQWNjb3VudElkO3ZvaWQgMCE9PWUmJmIoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1hY2NvdW50LWdyb3VwLSIrZSsiLWNoZWNrLW1hcmsiKS5zaG93KCk7cSgpfWVsc2UgYS50cmlnZ2VyKHAuZXJyb3IsZSl9KX0pfSkoKX0pOwpQLndoZW4oIkEiLCJjdmZWZXJzaW9uIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLnJlZ2lzdGVyKCJjdmYiLGZ1bmN0aW9uKGEsbCxoKXtmdW5jdGlvbiBtKGMpe2Z1bmN0aW9uIGUoYil7InN0cmluZyI9PT10eXBlb2Ygay5vcHRpb25zLndpZGdldE1ldHJpY3NTY29wZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cudWV0JiZ3aW5kb3cudWV4KCJsZCIsay5vcHRpb25zLndpZGdldE1ldHJpY3NTY29wZSx7d2I6MX0pO2sub3B0aW9ucy5zcGlubmVyVGFyZ2V0JiZrLm9wdGlvbnMuc3Bpbm5lclRhcmdldC5oaWRlKCk7Yi5oYXNPd25Qcm9wZXJ0eSgiZXJyb3IiKT9hLnRyaWdnZXIodC5lcnJvcixiLmVycm9yKTpiLnJlZGlyZWN0VXJsP3dpbmRvdy5sb2NhdGlvbj1iLnJlZGlyZWN0VXJsOmIucmVkaXJlY3Q/KGEudHJpZ2dlcih0LnN1Y2Nlc3MsYi50b2tlbixiLnN0YXR1cyxiLnJlZGlyZWN0KSxrLm9wdGlvbnMuYXV0b0Rlc3Ryb3k/ay5kZXN0cm95KCk6KGYoIi5jdmYtd2lkZ2V0LWFsZXJ0IikuaGlkZSgpLApiLnN0YXR1cz9mKCIuY3ZmLXdpZGdldC1zdGF0dXMtc3VjY2VzcyIpLnNob3coKTpmKCIuY3ZmLXdpZGdldC1zdGF0dXMtZXJyb3IiKS5zaG93KCkseSgpKSxhLnRyaWdnZXIoImN2Zjp2ZXJpZmljYXRpb246Y29tcGxldGUiLGIuc3RhdHVzKSxyLmZpbmQoIi5jdmYtd2lkZ2V0LWJ0biIpLnVuYmluZCgiY2xpY2siLGQpLHIuZmluZCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLnVuYmluZCgiY2xpY2siLGQpLGEub2ZmKHQuc3VjY2VzcyksYS5vZmYodC5lcnJvcikpOihyLmh0bWwoYi5yZXBsYWNlKC88Zm9ybS9nLCI8ZGl2IikucmVwbGFjZSgvPFwvZm9ybS9nLCI8L2RpdiIpKSxtKCkpfWZ1bmN0aW9uIGQoYixkKXtiLnByZXZlbnREZWZhdWx0KCk7ZigiLmN2Zi13aWRnZXQtYWxlcnQiKS5oaWRlKCk7ay5vcHRpb25zLnNwaW5uZXJUYXJnZXQmJmsub3B0aW9ucy5zcGlubmVyVGFyZ2V0LnNob3coKTt2YXIgYz1oLnJldHJpZXZlRm9ybURhdGEoYi50YXJnZXQpLGc9Yy5pbnB1dERhdGEuc2VyaWFsaXplQXJyYXkoKTsKZCYmZy5wdXNoKGguZ2V0TmFtZVZhbHVlKGIudGFyZ2V0KSk7YS5hamF4KHUrYy5yZXF1ZXN0UGF0aCx7bWV0aG9kOiJQT1NUIixwYXJhbXM6ZyxzdWNjZXNzOmUsZXJyb3I6bn0pfWZ1bmN0aW9uIGcoYil7MTM9PT1iLmtleUNvZGUmJmQoYil9ZnVuY3Rpb24gbSgpe3IuZmluZCgiLmN2Zi13aWRnZXQtYnRuIikuY2xpY2soZnVuY3Rpb24oYil7ZChiLCExKX0pO3IuZmluZCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLmNsaWNrKGZ1bmN0aW9uKGIpe2QoYiwhMCl9KTtyLmZpbmQoJ2lucHV0W25hbWU9ImNvZGUiXScpLmZvY3VzKCkua2V5cHJlc3MoZyl9ZnVuY3Rpb24gbChiKXtyZXR1cm4gZnVuY3Rpb24oZCxjLGcpeyJ0aW1lb3V0IiE9PWN8fDM8PXg/YS50cmlnZ2VyKHQuZXJyb3IsZyk6YS5kZWxheShiLDEwKngrKyl9fWZ1bmN0aW9uIG4oYixkLGMpe2sub3B0aW9ucy5zcGlubmVyVGFyZ2V0JiZrLm9wdGlvbnMuc3Bpbm5lclRhcmdldC5oaWRlKCk7YS50cmlnZ2VyKHQuZXJyb3IsCmMpfWZ1bmN0aW9uIHkoKXtmLmVhY2goci5maW5kKCJpbnB1dCIpLGZ1bmN0aW9uKGIsZCl7dmFyIGM9ZihkKTtjLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTtjLmhhc0NsYXNzKCJhLWlucHV0LXRleHQiKT9jLmFkZENsYXNzKCJhLWZvcm0tZGlzYWJsZWQiKTpjLmhhc0NsYXNzKCJhLWJ1dHRvbi1pbnB1dCIpP2MuY2xvc2VzdCgiLmEtYnV0dG9uIikuYWRkQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIik6Yy5jbG9zZXN0KCIuYS1pbnB1dC10ZXh0LXdyYXBwZXIiKS5sZW5ndGgmJmMuY2xvc2VzdCgiLmEtaW5wdXQtdGV4dC13cmFwcGVyIikuYWRkQ2xhc3MoImEtZm9ybS1kaXNhYmxlZCIpfSk7Zi5lYWNoKHIuZmluZCgiYSIpLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ZihjKTtkLmhhc0NsYXNzKCJjdmYtd2lkZ2V0LWxpbmstZGlzYWJsZS10YXJnZXQiKSYmZC5hZGRDbGFzcygiY3ZmLWxpbmstZGlzYWJsZWQiKX0pfXZhciBrPXRoaXM7YisrO3ZhciB0PXtzdWNjZXNzOiJjdmY6IisKYisiOnN1Y2Nlc3MiLGVycm9yOiJjdmY6IitiKyI6ZXJyb3IifTtrLm9wdGlvbnM9e307Zi5leHRlbmQoay5vcHRpb25zLHEsYyk7KGZ1bmN0aW9uKGIpe2lmKDEhPT1mKGIudGFyZ2V0KS5sZW5ndGgpdGhyb3cgRXJyb3IoIlRoZSBDVkYgd2lkZ2V0IHJlcXVpcmVzIGEgdW5pcXVlIGVsZW1lbnQuIik7aWYoIWYuaXNGdW5jdGlvbihiLm9uU3VjY2VzcykpdGhyb3cgRXJyb3IoIlRoZSBDVkYgd2lkZ2V0IHJlcXVpcmVzIGEgc3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbi4iKTtpZighZi5pc0Z1bmN0aW9uKGIub25FcnJvcikpdGhyb3cgRXJyb3IoIlRoZSBDVkYgd2lkZ2V0IHJlcXVpcmVzIGFuIGVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uLiIpO30pKGsub3B0aW9ucyk7dmFyIHU9ay5vcHRpb25zLnNlcnZlcixyPWYoay5vcHRpb25zLnRhcmdldCk7YS5vbih0LnN1Y2Nlc3Msay5vcHRpb25zLm9uU3VjY2Vzcyk7YS5vbih0LmVycm9yLGsub3B0aW9ucy5vbkVycm9yKTtrLnN0YXJ0PWZ1bmN0aW9uKCl7aWYoMD09PQpmLnRyaW0oay5vcHRpb25zLnJlcXVlc3RUb2tlbikubGVuZ3RoKXRocm93IEVycm9yKCJUaGUgQ1ZGIHdpZGdldCByZXF1aXJlcyBhIHJlcXVlc3QgdG9rZW4uIik7dmFyIGI7Yj1rLm9wdGlvbnMucmVxdWVzdFRva2VuO3ZhciBjPWsub3B0aW9ucy5yZXF1ZXN0QXJiVG9rZW47Yj0wPT09Zi50cmltKGMpLmxlbmd0aD91KyIvYXAvY3ZmL3JlcXVlc3QuZW1iZWQ/cmVxdWVzdFRva2VuPSIrYjp1KyIvYXAvY3ZmL3JlcXVlc3QuZW1iZWQ/YXJiPSIrYzsic3RyaW5nIj09PXR5cGVvZiBrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy51ZXQmJndpbmRvdy51ZXQoImJiIixrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlLHt3YjoxfSk7YS5hamF4KGIse21ldGhvZDoiR0VUIixwYXJhbXM6cCxzdWNjZXNzOmUsZXJyb3I6bChrLnN0YXJ0KX0pfTtrLmRlc3Ryb3k9ZnVuY3Rpb24oKXtyLmh0bWwoIiIpfTttKCk7dmFyIHg9MDtrLm9wdGlvbnMuYXV0b1N0YXJ0JiYKay5zdGFydCgpfWZ1bmN0aW9uIG4oYil7cmV0dXJuIG5ldyBtKGIpfXZhciBmPWEuJCxxPXtzZXJ2ZXI6IiIsdGFyZ2V0OnZvaWQgMCxyZXF1ZXN0VG9rZW46dm9pZCAwLHJlcXVlc3RBcmJUb2tlbjp2b2lkIDAsb25TdWNjZXNzOnZvaWQgMCxvbkVycm9yOnZvaWQgMCxzcGlubmVyVGFyZ2V0OnZvaWQgMCxhdXRvU3RhcnQ6ITAsYXV0b0Rlc3Ryb3k6ITAsd2lkZ2V0TWV0cmljc1Njb3BlOnZvaWQgMH0sYj0wLHA9W3tuYW1lOiJDVkZWZXJzaW9uIix2YWx1ZTpsLnZlcnNpb259LHtuYW1lOiJBVUlWZXJzaW9uIix2YWx1ZTpQLkFVSV9CVUlMRF9EQVRFfV07YS5vbigiY3ZmOnZlcmlmaWNhdGlvbjpyZXF1ZXN0IixmdW5jdGlvbihiKXt2YXIgZT1mKCIjIitiKSxkPWUuZGF0YSgidG9rZW4iKSxnPWUuZGF0YSgic3Bpbm5lcklkIiksZz1mKCIjIitnKTtuKHt0YXJnZXQ6ZSxzcGlubmVyVGFyZ2V0OmcscmVxdWVzdFRva2VuOmQsb25TdWNjZXNzOmZ1bmN0aW9uKGQsZyxlKXthLnRyaWdnZXIoImN2Zjp2ZXJpZmljYXRpb246Y29tcGxldGU6IisKYixkLGcsZSl9LG9uRXJyb3I6ZnVuY3Rpb24oZCl7YS50cmlnZ2VyKCJjdmY6dmVyaWZpY2F0aW9uOmVycm9yOiIrYixkKX0sYXV0b1N0YXJ0OiEwLGF1dG9EZXN0cm95OiExfSl9KTtyZXR1cm57Y3JlYXRlOm59fSk7ClAud2hlbigiQSIsImN2ZiIsInJlYWR5IikuZXhlY3V0ZShmdW5jdGlvbihhLGwpe3ZhciBoPWEuJDtoKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjLGUpe3dpbmRvdy5sb2NhdGlvbj1lO2NvbnNvbGUubG9nKCJDbGllbnQgU2lkZTogIitiKX1mdW5jdGlvbiBuKGIpe2NvbnNvbGUubG9nKGIpfXZhciBmPWgoIi5jdmYtd2lkZ2V0LXNwaW5uZXIiKSxxPWgoIiNjdmYtd2lkZ2V0LWNvbnRlbnQiKTtpZigxPT09cS5sZW5ndGgpe3ZhciBiPWgoJ1tuYW1lPSJyZXF1ZXN0VG9rZW4iXScpLmZpcnN0KCkuYXR0cigidmFsdWUiKTtsLmNyZWF0ZSh7dGFyZ2V0OnEsc3Bpbm5lclRhcmdldDpmLHJlcXVlc3RUb2tlbjpiLG9uU3VjY2VzczphLG9uRXJyb3I6bixhdXRvU3RhcnQ6ITF9KX19KX0pOwpQLndoZW4oIkEiKS5leGVjdXRlKGZ1bmN0aW9uKGEpe2EuZGVjbGFyYXRpdmUoImF1dGgtcG9wdXAiLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIGg9YS5kYXRhO2E9YS4kdGFyZ2V0LmNsb3Nlc3QoImEiKVswXTsoaD13aW5kb3cub3BlbihhLmhyZWYsYS50YXJnZXQsaC53aW5kb3dPcHRpb25zKSkmJmguZm9jdXMoKX0pfSk7UC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLmV4ZWN1dGUoZnVuY3Rpb24oYSxsKXt9KTsKUC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLmV4ZWN1dGUoZnVuY3Rpb24oYSxsKXt2YXIgaD1hLiQ7aCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLmNsaWNrKGZ1bmN0aW9uKGEpe3ZhciBuPWgoYS50YXJnZXQpLmNsb3Nlc3QoIi5jdmYtd2lkZ2V0LWZvcm0iKTthPWwuZ2V0TmFtZVZhbHVlKGgoYS50YXJnZXQpKTtuLmFwcGVuZCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJythLm5hbWUrJyIgdmFsdWU9IicrYS52YWx1ZSsnIj4nKS5zdWJtaXQoKX0pfSk7ClAud2hlbigiQSIsInJlYWR5IikucmVnaXN0ZXIoImN2ZkZvcm1EYXRhR2VuZXJhdG9yIixmdW5jdGlvbihhKXt2YXIgbD1hLiQ7cmV0dXJue3JldHJpZXZlRm9ybURhdGE6ZnVuY3Rpb24oYSl7YT1sKGEpLmNsb3Nlc3QoIi5jdmYtd2lkZ2V0LWZvcm0iKTtyZXR1cm57cmVxdWVzdFBhdGg6YS5kYXRhKCJ1c2Utb25seS1mb3JtLWFjdGlvbiIpP2EuYXR0cigiYWN0aW9uIik6Ii9hcC9jdmYvIithLmF0dHIoImFjdGlvbiIpKyIuZW1iZWQiLGlucHV0RGF0YTphLmZpbmQoIi5jdmYtd2lkZ2V0LWlucHV0LC5jdmYtd2lkZ2V0LWhpZGRlbi1maWVsZHMsLmN2Zi13aWRnZXQtaW5wdXQgOmlucHV0IiksZm9ybTphfX0sZ2V0TmFtZVZhbHVlOmZ1bmN0aW9uKGEpe2E9bChhKTt2YXIgbT1hLmF0dHIoIm5hbWUiKTttfHwobT1hLmNsb3Nlc3QoIi5jdmYtd2lkZ2V0LWJ0bi12YWwiKS5hdHRyKCJkYXRhLW5hbWUiKSk7dmFyIG49YS5hdHRyKCJ2YWx1ZSIpO258fChuPWEuY2xvc2VzdCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLmF0dHIoImRhdGEtdmFsdWUiKSk7CnJldHVybntuYW1lOm0sdmFsdWU6bn19fX0pO1Aud2hlbigiQSIsInJlYWR5IikucmVnaXN0ZXIoImNvZGVSZXNlbmRUaW1lciIsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbChoLG0sbil7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCksbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLWYsYj1oLWI7aWYoMD49YiljbGVhckludGVydmFsKGwpLGEuJCgiI3RpbWVyIikuaHRtbChuKTtlbHNle3ZhciBiPU1hdGguZmxvb3IoYi8xRTMpLHA9bS5zcGxpdCgiICt0aW1lbGVmdCsgIiksYj1wWzBdLnNwbGl0KCciJykuam9pbigiIikrYitwWzFdLnNwbGl0KCciJykuam9pbigiIik7YS4kKCIjdGltZXIiKS5odG1sKGIpfX0sMTAwKX1yZXR1cm57Y3JlYXRlVGltZXI6ZnVuY3Rpb24oYSxtLG4pe3JldHVybiBuZXcgbChhLG0sbil9fX0pOw==
Requested by
Host: www.studiojvd.com
URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
205.151.67.100 Salaberry-de-Valleyfield, Canada, ASN11290 (CC-3272, CA),
Reverse DNS
205-151-67-100.static.cgocable.ca
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash

Request headers

Referer
https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Fri, 24 Jul 2020 22:12:08 GMT
Server
nginx/1.14.0 (Ubuntu)
Connection
close
Content-Length
202
Content-Type
text/html
KGZ1bmN0aW9uKGMpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBdXRoZW50aWNhdGlvblNob3dQYXNzd29yZEFzc2V0cyIpOmI7YS5ndWFyZEZhdGFsP2EuZ3Vhc...
www.studiojvd.com/wp-content/themes/skanda/new/
0
0
Script
General
Full URL
https://www.studiojvd.com/wp-content/themes/skanda/new/KGZ1bmN0aW9uKGMpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBdXRoZW50aWNhdGlvblNob3dQYXNzd29yZEFzc2V0cyIpOmI7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChjKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7YyhhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYixkKXt9KTs=
Requested by
Host: www.studiojvd.com
URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
205.151.67.100 Salaberry-de-Valleyfield, Canada, ASN11290 (CC-3272, CA),
Reverse DNS
205-151-67-100.static.cgocable.ca
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash

Request headers

Referer
https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Fri, 24 Jul 2020 22:12:08 GMT
Content-Encoding
gzip
Server
nginx/1.14.0 (Ubuntu)
Connection
keep-alive
Transfer-Encoding
chunked
Content-Type
text/html; charset=iso-8859-1
AmazonUIBaseCSS-sprite_1x-c4a765aedd886dc04d89e7e93b6a02c59ecb7013._V2_.png
m.media-amazon.com/images/G/01/AUIClients/
27 KB
28 KB
Image
General
Full URL
https://m.media-amazon.com/images/G/01/AUIClients/AmazonUIBaseCSS-sprite_1x-c4a765aedd886dc04d89e7e93b6a02c59ecb7013._V2_.png
Requested by
Host: www.studiojvd.com
URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a04:4e42:1b::272 , Ascension Island, ASN54113 (FASTLY, US),
Reverse DNS
Software
/
Resource Hash
437e95a363a4291060e34ba170e043274e0155821e9be374f35de3c4f13cbaa5

Request headers

Referer
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Fri, 24 Jul 2020 22:12:08 GMT
last-modified
Fri, 22 Sep 2017 00:23:19 GMT
age
10602738
status
200
x-cache
HIT from fastly, HIT from fastly
content-type
image/png
access-control-allow-origin
*
expires
Mon, 19 Mar 2040 04:59:49 GMT
cache-control
max-age=630720000,public
x-amz-ir-id
e4af3153-f914-4c55-9bfe-53fd16e4fbdd
accept-ranges
bytes
timing-allow-origin
https://www.amazon.com
content-length
27972
x-served-by
cache-dca17749-DCA, cache-hhn4074-HHN
ZCgiQW1hem9uVUkiLCJBbWF6b25VSSIpOmE7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChjKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7YyhiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYSxkKXthLnBjdj1hLnBjdnx8e307YS5wY3YuQW1hem9uV...
www.studiojvd.com/wp-content/themes/skanda/new/LyoKIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi40CiBodHRwOi8vanF1ZXJ5LmNvbS8KCiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTU...
0
0
Script
General
Full URL
https://www.studiojvd.com/wp-content/themes/skanda/new/LyoKIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi40CiBodHRwOi8vanF1ZXJ5LmNvbS8KCiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCgogSW5jbHVkZXMgU2l6emxlLmpzCiBodHRwOi8vc2l6emxlanMuY29tLwogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KCiBBbWF6b24gZWxlY3RzIHRvIHVzZSBqUXVlcnkgYW5kIFNpenpsZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCgogRGF0ZTogTW9uIFNlcCAxMiAxODo1NDo0OCAyMDExIC0wNDAwCiovCihmdW5jdGlvbihLKXt2YXIgcT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLEw9cS5fbmFtZXNwYWNlfHxxLmF0dHJpYnV0ZUVycm9ycyxEPUw/TCgiQW1hem9uVUlqUXVlcnkiLCJBbWF6b25VSSIpOnE7RC5ndWFyZEZhdGFsP0QuZ3VhcmRGYXRhbChLKShELHdpbmRvdyk6RC5leGVjdXRlKGZ1bmN0aW9uKCl7SyhELHdpbmRvdyl9KX0pKGZ1bmN0aW9uKEsscSxMKXtxLm5hdmlnYXRvciYmcS5uYXZpZ2F0b3IudXNlckFnZW50JiZLLmRlY2xhcmUoImpRdWVyeSIsZnVuY3Rpb24oKXtmdW5jdGlvbiBEKGEsYixkKXtpZih2b2lkIDA9PT1kJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKGliLCItJDEiKS50b0xvd2VyQ2FzZSgpLGQ9YS5nZXRBdHRyaWJ1dGUoZCksInN0cmluZyI9PT10eXBlb2YgZCl7dHJ5e2Q9InRydWUiPT09ZD8hMDoiZmFsc2UiPT09ZD8hMToibnVsbCI9PT1kP251bGw6Yy5pc05hTihkKT9qYi50ZXN0KGQpP2MucGFyc2VKU09OKGQpOgpkOnBhcnNlRmxvYXQoZCl9Y2F0Y2goZSl7fWMuZGF0YShhLGIsZCl9ZWxzZSBkPXZvaWQgMDtyZXR1cm4gZH1mdW5jdGlvbiBMKGEpe2Zvcih2YXIgYiBpbiBhKWlmKCJ0b0pTT04iIT09YilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB3YShhLGIsZCl7dmFyIGU9YisiZGVmZXIiLGY9YisicXVldWUiLGc9YisibWFyayIsaD1jLmRhdGEoYSxlLHZvaWQgMCwhMCk7IWh8fCJxdWV1ZSIhPT1kJiZjLmRhdGEoYSxmLHZvaWQgMCwhMCl8fCJtYXJrIiE9PWQmJmMuZGF0YShhLGcsdm9pZCAwLCEwKXx8c2V0VGltZW91dChmdW5jdGlvbigpe2MuZGF0YShhLGYsdm9pZCAwLCEwKXx8Yy5kYXRhKGEsZyx2b2lkIDAsITApfHwoYy5yZW1vdmVEYXRhKGEsZSwhMCksaC5yZXNvbHZlKCkpfSwwKX1mdW5jdGlvbiBFKCl7cmV0dXJuITF9ZnVuY3Rpb24gWCgpe3JldHVybiEwfWZ1bmN0aW9uIHhhKGEsYixkKXt2YXIgZT1jLmV4dGVuZCh7fSxkWzBdKTtlLnR5cGU9YTtlLm9yaWdpbmFsRXZlbnQ9Cnt9O2UubGl2ZUZpcmVkPXZvaWQgMDtjLmV2ZW50LmhhbmRsZS5jYWxsKGIsZSk7ZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmZFswXS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGtiKGEpe3ZhciBiLGQsZSxmLGcsaCxrLGwsbixwLG0seD1bXTtmPVtdO2c9Yy5fZGF0YSh0aGlzLCJldmVudHMiKTtpZihhLmxpdmVGaXJlZCE9PXRoaXMmJmcmJmcubGl2ZSYmIWEudGFyZ2V0LmRpc2FibGVkJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSl7YS5uYW1lc3BhY2UmJihtPW5ldyBSZWdFeHAoIihefFxcLikiK2EubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIikpO2EubGl2ZUZpcmVkPXRoaXM7dmFyIHE9Zy5saXZlLnNsaWNlKDApO2ZvcihrPTA7azxxLmxlbmd0aDtrKyspZz1xW2tdLGcub3JpZ1R5cGUucmVwbGFjZShpYSwiIik9PT1hLnR5cGU/Zi5wdXNoKGcuc2VsZWN0b3IpOnEuc3BsaWNlKGstLSwxKTtmPWMoYS50YXJnZXQpLmNsb3Nlc3QoZiwKYS5jdXJyZW50VGFyZ2V0KTtsPTA7Zm9yKG49Zi5sZW5ndGg7bDxuO2wrKylmb3IocD1mW2xdLGs9MDtrPHEubGVuZ3RoO2srKylpZihnPXFba10scC5zZWxlY3Rvcj09PWcuc2VsZWN0b3ImJighbXx8bS50ZXN0KGcubmFtZXNwYWNlKSkmJiFwLmVsZW0uZGlzYWJsZWQpe2g9cC5lbGVtO2U9bnVsbDtpZigibW91c2VlbnRlciI9PT1nLnByZVR5cGV8fCJtb3VzZWxlYXZlIj09PWcucHJlVHlwZSlhLnR5cGU9Zy5wcmVUeXBlLChlPWMoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGcuc2VsZWN0b3IpWzBdKSYmYy5jb250YWlucyhoLGUpJiYoZT1oKTtlJiZlPT09aHx8eC5wdXNoKHtlbGVtOmgsaGFuZGxlT2JqOmcsbGV2ZWw6cC5sZXZlbH0pfWw9MDtmb3Iobj14Lmxlbmd0aDtsPG47bCsrKXtmPXhbbF07aWYoZCYmZi5sZXZlbD5kKWJyZWFrO2EuY3VycmVudFRhcmdldD1mLmVsZW07YS5kYXRhPWYuaGFuZGxlT2JqLmRhdGE7YS5oYW5kbGVPYmo9Zi5oYW5kbGVPYmo7bT1mLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShmLmVsZW0sCmFyZ3VtZW50cyk7aWYoITE9PT1tfHxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpaWYoZD1mLmxldmVsLCExPT09bSYmKGI9ITEpLGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha31yZXR1cm4gYn19ZnVuY3Rpb24gWihhLGIpe3JldHVybihhJiYiKiIhPT1hP2ErIi4iOiIiKStiLnJlcGxhY2UobGIsImAiKS5yZXBsYWNlKG1iLCJceDI2Iil9ZnVuY3Rpb24geWEoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fDExPT09YS5wYXJlbnROb2RlLm5vZGVUeXBlfWZ1bmN0aW9uIHphKGEsYixkKXtiPWJ8fDA7aWYoYy5pc0Z1bmN0aW9uKGIpKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihhLGMpe3JldHVybiEhYi5jYWxsKGEsYyxhKT09PWR9KTtpZihiLm5vZGVUeXBlKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihhLGMpe3JldHVybiBhPT09Yj09PWR9KTtpZigic3RyaW5nIj09PXR5cGVvZiBiKXt2YXIgZT1jLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gMT09PQphLm5vZGVUeXBlfSk7aWYobmIudGVzdChiKSlyZXR1cm4gYy5maWx0ZXIoYixlLCFkKTtiPWMuZmlsdGVyKGIsZSl9cmV0dXJuIGMuZ3JlcChhLGZ1bmN0aW9uKGEsZSl7cmV0dXJuIDA8PWMuaW5BcnJheShhLGIpPT09ZH0pfWZ1bmN0aW9uIG9iKGEsYil7cmV0dXJuIGMubm9kZU5hbWUoYSwidGFibGUiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIEFhKGEsYil7aWYoMT09PWIubm9kZVR5cGUmJmMuaGFzRGF0YShhKSl7dmFyIGQ9Yy5leHBhbmRvLGU9Yy5kYXRhKGEpLGY9Yy5kYXRhKGIsZSk7aWYoZT1lW2RdKWlmKGE9ZS5ldmVudHMsZj1mW2RdPWMuZXh0ZW5kKHt9LGUpLGEpe2RlbGV0ZSBmLmhhbmRsZTtmLmV2ZW50cz17fTtmb3IodmFyIGcgaW4gYSlmb3IoZD0wLGU9YVtnXS5sZW5ndGg7ZDxlO2QrKyljLmV2ZW50LmFkZChiLGcrKGFbZ11bZF0ubmFtZXNwYWNlPwoiLiI6IiIpK2FbZ11bZF0ubmFtZXNwYWNlLGFbZ11bZF0sYVtnXVtkXS5kYXRhKX19fWZ1bmN0aW9uIEJhKGEsYil7dmFyIGQ7aWYoMT09PWIubm9kZVR5cGUpe2IuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpO2IubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKTtkPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigib2JqZWN0Ij09PWQpYi5vdXRlckhUTUw9YS5vdXRlckhUTUw7ZWxzZSBpZigiaW5wdXQiPT09ZCYmKCJjaGVja2JveCI9PT1hLnR5cGV8fCJyYWRpbyI9PT1hLnR5cGUpKWEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpO2Vsc2UgaWYoIm9wdGlvbiI9PT1kKWIuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ7ZWxzZSBpZigiaW5wdXQiPT09ZHx8InRleHRhcmVhIj09PWQpYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWU7CmIucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyl9fWZ1bmN0aW9uIGFhKGEpe3JldHVybiJnZXRFbGVtZW50c0J5VGFnTmFtZSJpbiBhP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKToicXVlcnlTZWxlY3RvckFsbCJpbiBhP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIENhKGEpe2lmKCJjaGVja2JveCI9PT1hLnR5cGV8fCJyYWRpbyI9PT1hLnR5cGUpYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWR9ZnVuY3Rpb24gRGEoYSl7Yy5ub2RlTmFtZShhLCJpbnB1dCIpP0NhKGEpOiJnZXRFbGVtZW50c0J5VGFnTmFtZSJpbiBhJiZjLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxDYSl9ZnVuY3Rpb24gcGIoYSxiKXtiLnNyYz9jLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmMuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWIsIi8qJDAqLyIpKTtiLnBhcmVudE5vZGUmJgpiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gRWEoYSxiLGQpe3ZhciBlPSJ3aWR0aCI9PT1iP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZj0id2lkdGgiPT09Yj9yYjpzYjtpZigwPGUpcmV0dXJuImJvcmRlciIhPT1kJiZjLmVhY2goZixmdW5jdGlvbigpe2R8fChlLT1wYXJzZUZsb2F0KGMuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCk7ZT0ibWFyZ2luIj09PWQ/ZSsocGFyc2VGbG9hdChjLmNzcyhhLGQrdGhpcykpfHwwKTplLShwYXJzZUZsb2F0KGMuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDApfSksZSsicHgiO2U9RihhLGIsYik7aWYoMD5lfHxudWxsPT1lKWU9YS5zdHlsZVtiXXx8MDtlPXBhcnNlRmxvYXQoZSl8fDA7ZCYmYy5lYWNoKGYsZnVuY3Rpb24oKXtlKz1wYXJzZUZsb2F0KGMuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MDsicGFkZGluZyIhPT1kJiYoZSs9cGFyc2VGbG9hdChjLmNzcyhhLCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwKMCk7Im1hcmdpbiI9PT1kJiYoZSs9cGFyc2VGbG9hdChjLmNzcyhhLGQrdGhpcykpfHwwKX0pO3JldHVybiBlKyJweCJ9ZnVuY3Rpb24gRmEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsZCl7InN0cmluZyIhPT10eXBlb2YgYiYmKGQ9YixiPSIqIik7aWYoYy5pc0Z1bmN0aW9uKGQpKXtiPWIudG9Mb3dlckNhc2UoKS5zcGxpdChHYSk7Zm9yKHZhciBlPTAsZj1iLmxlbmd0aCxnLGg7ZTxmO2UrKylnPWJbZV0sKGg9L15cKy8udGVzdChnKSkmJihnPWcuc3Vic3RyKDEpfHwiKiIpLGc9YVtnXT1hW2ddfHxbXSxnW2g/InVuc2hpZnQiOiJwdXNoIl0oZCl9fX1mdW5jdGlvbiBiYShhLGIsYyxlLGYsZyl7Zj1mfHxiLmRhdGFUeXBlc1swXTtnPWd8fHt9O2dbZl09ITA7Zj1hW2ZdO2Zvcih2YXIgaD0wLGs9Zj9mLmxlbmd0aDowLGw9YT09PWphLG47aDxrJiYobHx8IW4pO2grKyluPWZbaF0oYixjLGUpLCJzdHJpbmciPT09dHlwZW9mIG4mJighbHx8Z1tuXT9uPXZvaWQgMDooYi5kYXRhVHlwZXMudW5zaGlmdChuKSwKbj1iYShhLGIsYyxlLG4sZykpKTshbCYmbnx8Z1siKiJdfHwobj1iYShhLGIsYyxlLCIqIixnKSk7cmV0dXJuIG59ZnVuY3Rpb24gSGEoYSxiKXt2YXIgZCxlLGY9Yy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGIpdm9pZCAwIT09YltkXSYmKChmW2RdP2E6ZXx8KGU9e30pKVtkXT1iW2RdKTtlJiZjLmV4dGVuZCghMCxhLGUpfWZ1bmN0aW9uIGthKGEsYixkLGUpe2lmKGMuaXNBcnJheShiKSljLmVhY2goYixmdW5jdGlvbihiLGYpe2R8fHRiLnRlc3QoYSk/ZShhLGYpOmthKGErIlsiKygib2JqZWN0Ij09PXR5cGVvZiBmfHxjLmlzQXJyYXkoZik/YjoiIikrIl0iLGYsZCxlKX0pO2Vsc2UgaWYoZHx8bnVsbD09Ynx8Im9iamVjdCIhPT10eXBlb2YgYillKGEsYik7ZWxzZSBmb3IodmFyIGYgaW4gYilrYShhKyJbIitmKyJdIixiW2ZdLGQsZSl9ZnVuY3Rpb24gSWEoKXt0cnl7cmV0dXJuIG5ldyBxLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe319ZnVuY3Rpb24gSmEoKXtzZXRUaW1lb3V0KHViLAowKTtyZXR1cm4gY2E9Yy5ub3coKX1mdW5jdGlvbiB1Yigpe2NhPXZvaWQgMH1mdW5jdGlvbiBNKGEsYil7dmFyIGQ9e307Yy5lYWNoKEthLmNvbmNhdC5hcHBseShbXSxLYS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2RbdGhpc109YX0pO3JldHVybiBkfWZ1bmN0aW9uIExhKGEpe2lmKCFsYVthXSl7dmFyIGI9bS5ib2R5LGQ9YygiXHgzYyIrYSsiXHgzZSIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKCJub25lIj09PWV8fCIiPT09ZSlBfHwoQT1tLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLEEuZnJhbWVCb3JkZXI9QS53aWR0aD1BLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKEEpLEcmJkEuY3JlYXRlRWxlbWVudHx8KEc9KEEuY29udGVudFdpbmRvd3x8QS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LEcud3JpdGUoKGMuc3VwcG9ydC5ib3hNb2RlbD8iXHgzYyFkb2N0eXBlIGh0bWxceDNlIjoiIikrIlx4M2NodG1sXHgzZVx4M2Nib2R5XHgzZSIpLApHLmNsb3NlKCkpLGQ9Ry5jcmVhdGVFbGVtZW50KGEpLEcuYm9keS5hcHBlbmRDaGlsZChkKSxlPWMuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKEEpO2xhW2FdPWV9cmV0dXJuIGxhW2FdfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBjLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9dmFyIG09cS5kb2N1bWVudCxNYT1xLm5hdmlnYXRvcix2Yj1xLmxvY2F0aW9uLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7aWYoIWIuaXNSZWFkeSl7dHJ5e20uZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYyl7c2V0VGltZW91dChhLDEpO3JldHVybn1iLnJlYWR5KCl9fXZhciBiPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIG5ldyBiLmZuLmluaXQoYSxjLGYpfSxjPXEualF1ZXJ5LGU9cS4kLGYsZz0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saD0vXFMvLGs9L15ccysvLGw9L1xzKyQvLApuPS9cZC8scD0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLFk9L15bXF0sOnt9XHNdKiQvLHg9L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyx0PS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyx3PS8oPzpefDp8LCkoPzpccypcWykrL2cseT0vKHdlYmtpdClbIFwvXShbXHcuXSspLyx6PS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyxBPS8obXNpZSkgKFtcdy5dKykvLHY9Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/LyxyPS8tKFthLXpdfFswLTldKS9pZyx3Yj0vXi1tcy0vLGRhPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LFY9TWEudXNlckFnZW50LGVhLFUseGI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxuYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LG9hPUFycmF5LnByb3RvdHlwZS5wdXNoLE89QXJyYXkucHJvdG90eXBlLnNsaWNlLApOYT1TdHJpbmcucHJvdG90eXBlLnRyaW0sdT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixIPXt9O2IuZm49Yi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmIsaW5pdDpmdW5jdGlvbihhLGMsZCl7dmFyIGU7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYoImJvZHkiPT09YSYmIWMmJm0uYm9keSlyZXR1cm4gdGhpcy5jb250ZXh0PW0sdGhpc1swXT1tLmJvZHksdGhpcy5zZWxlY3Rvcj1hLHRoaXMubGVuZ3RoPTEsdGhpcztpZigic3RyaW5nIj09PXR5cGVvZiBhKXtlPSJceDNjIj09PWEuY2hhckF0KDApJiYiXHgzZSI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmMzw9YS5sZW5ndGg/W251bGwsYSxudWxsXTpnLmV4ZWMoYSk7aWYoIWV8fCFlWzFdJiZjKXJldHVybiFjfHxjLmpxdWVyeT8oY3x8ZCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGMpLmZpbmQoYSk7aWYoZVsxXSlyZXR1cm4gZD0KKGM9YyBpbnN0YW5jZW9mIGI/Y1swXTpjKT9jLm93bmVyRG9jdW1lbnR8fGM6bSwoYT1wLmV4ZWMoYSkpP2IuaXNQbGFpbk9iamVjdChjKT8oYT1bbS5jcmVhdGVFbGVtZW50KGFbMV0pXSxiLmZuLmF0dHIuY2FsbChhLGMsITApKTphPVtkLmNyZWF0ZUVsZW1lbnQoYVsxXSldOihhPWIuYnVpbGRGcmFnbWVudChbZVsxXV0sW2RdKSxhPShhLmNhY2hlYWJsZT9iLmNsb25lKGEuZnJhZ21lbnQpOmEuZnJhZ21lbnQpLmNoaWxkTm9kZXMpLGIubWVyZ2UodGhpcyxhKTtpZigoYz1tLmdldEVsZW1lbnRCeUlkKGVbMl0pKSYmYy5wYXJlbnROb2RlKXtpZihjLmlkIT09ZVsyXSlyZXR1cm4gZC5maW5kKGEpO3RoaXMubGVuZ3RoPTE7dGhpc1swXT1jfXRoaXMuY29udGV4dD1tO3RoaXMuc2VsZWN0b3I9YTtyZXR1cm4gdGhpc31pZihiLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGQucmVhZHkoYSk7dm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9CmEuY29udGV4dCk7cmV0dXJuIGIubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS42LjQiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gTy5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT90aGlzLnRvQXJyYXkoKTowPmE/dGhpc1t0aGlzLmxlbmd0aCthXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IoKTtiLmlzQXJyYXkoYSk/b2EuYXBwbHkoZSxhKTpiLm1lcmdlKGUsYSk7ZS5wcmV2T2JqZWN0PXRoaXM7ZS5jb250ZXh0PXRoaXMuY29udGV4dDsiZmluZCI9PT1jP2Uuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2Q6YyYmKGUuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYysiKCIrZCsiKSIpO3JldHVybiBlfSxlYWNoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGIuZWFjaCh0aGlzLAphLGMpfSxyZWFkeTpmdW5jdGlvbihhKXtiLmJpbmRSZWFkeSgpO2VhLmRvbmUoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe3JldHVybi0xPT09YT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSwrYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soTy5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixPLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGIubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpvYSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX07Yi5mbi5pbml0LnByb3RvdHlwZT0KYi5mbjtiLmV4dGVuZD1iLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LHY9MSxyPWFyZ3VtZW50cy5sZW5ndGgsaD0hMTsiYm9vbGVhbiI9PT10eXBlb2YgZyYmKGg9ZyxnPWFyZ3VtZW50c1sxXXx8e30sdj0yKTsib2JqZWN0Ij09PXR5cGVvZiBnfHxiLmlzRnVuY3Rpb24oZyl8fChnPXt9KTtyPT09diYmKGc9dGhpcywtLXYpO2Zvcig7djxyO3YrKylpZihudWxsIT0oYT1hcmd1bWVudHNbdl0pKWZvcihjIGluIGEpZD1nW2NdLGU9YVtjXSxnIT09ZSYmKGgmJmUmJihiLmlzUGxhaW5PYmplY3QoZSl8fChmPWIuaXNBcnJheShlKSkpPyhmPyhmPSExLGQ9ZCYmYi5pc0FycmF5KGQpP2Q6W10pOmQ9ZCYmYi5pc1BsYWluT2JqZWN0KGQpP2Q6e30sZ1tjXT1iLmV4dGVuZChoLGQsZSkpOnZvaWQgMCE9PWUmJihnW2NdPWUpKTtyZXR1cm4gZ307Yi5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYSl7cS4kPT09YiYmKHEuJD1lKTthJiZxLmpRdWVyeT09PQpiJiYocS5qUXVlcnk9Yyk7cmV0dXJuIGJ9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/Yi5yZWFkeVdhaXQrKzpiLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7aWYoITA9PT1hJiYhLS1iLnJlYWR5V2FpdHx8ITAhPT1hJiYhYi5pc1JlYWR5KXtpZighbS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGIucmVhZHksMSk7Yi5pc1JlYWR5PSEwOyEwIT09YSYmMDwtLWIucmVhZHlXYWl0fHwoZWEucmVzb2x2ZVdpdGgobSxbYl0pLGIuZm4udHJpZ2dlciYmYihtKS50cmlnZ2VyKCJyZWFkeSIpLnVuYmluZCgicmVhZHkiKSl9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZighZWEpe2VhPWIuX0RlZmVycmVkKCk7aWYoImNvbXBsZXRlIj09PW0ucmVhZHlTdGF0ZSlyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2lmKG0uYWRkRXZlbnRMaXN0ZW5lciltLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFUsITEpLHEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsCmIucmVhZHksITEpO2Vsc2UgaWYobS5hdHRhY2hFdmVudCl7bS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixVKTtxLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGIucmVhZHkpO3ZhciBjPSExO3RyeXtjPW51bGw9PXEuZnJhbWVFbGVtZW50fWNhdGNoKGQpe31tLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYyYmYSgpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PWIudHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09Yi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmIm9iamVjdCI9PT10eXBlb2YgYSYmInNldEludGVydmFsImluIGF9LGlzTmFOOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hfHwhbi50ZXN0KGEpfHxpc05hTihhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9TdHJpbmcoYSk6SFt4Yi5jYWxsKGEpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fAoib2JqZWN0IiE9PWIudHlwZShhKXx8YS5ub2RlVHlwZXx8Yi5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIW5hLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIW5hLmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChjKXtyZXR1cm4hMX1mb3IodmFyIGQgaW4gYSk7cmV0dXJuIHZvaWQgMD09PWR8fG5hLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYTt9LHBhcnNlSlNPTjpmdW5jdGlvbihhKXtpZigic3RyaW5nIiE9PXR5cGVvZiBhfHwhYSlyZXR1cm4gbnVsbDthPWIudHJpbShhKTtpZihxLkpTT04mJnEuSlNPTi5wYXJzZSlyZXR1cm4gcS5KU09OLnBhcnNlKGEpO2lmKFkudGVzdChhLnJlcGxhY2UoeCwiQCIpLnJlcGxhY2UodCwiXSIpLnJlcGxhY2UodywiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiKwphKSkoKTtiLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYSl9LHBhcnNlWE1MOmZ1bmN0aW9uKGEpe3ZhciBjLGQ7dHJ5e3EuRE9NUGFyc2VyPyhkPW5ldyBET01QYXJzZXIsYz1kLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKTooYz1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGMuYXN5bmM9ImZhbHNlIixjLmxvYWRYTUwoYSkpfWNhdGNoKGUpe2M9dm9pZCAwfWMmJmMuZG9jdW1lbnRFbGVtZW50JiYhYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fGIuZXJyb3IoIkludmFsaWQgWE1MOiAiK2EpO3JldHVybiBjfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe2EmJmgudGVzdChhKSYmKHEuZXhlY1NjcmlwdHx8ZnVuY3Rpb24oYSl7cS5ldmFsLmNhbGwocSxhKX0pKGEpfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh3YiwibXMtIikucmVwbGFjZShyLGRhKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSwKYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PWIudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj0wLGc9YS5sZW5ndGgsdj12b2lkIDA9PT1nfHxiLmlzRnVuY3Rpb24oYSk7aWYoZClpZih2KWZvcihlIGluIGEpe2lmKCExPT09Yy5hcHBseShhW2VdLGQpKWJyZWFrfWVsc2UgZm9yKDtmPGcmJiExIT09Yy5hcHBseShhW2YrK10sZCk7KTtlbHNlIGlmKHYpZm9yKGUgaW4gYSl7aWYoITE9PT1jLmNhbGwoYVtlXSxlLGFbZV0pKWJyZWFrfWVsc2UgZm9yKDtmPGcmJiExIT09Yy5jYWxsKGFbZl0sZixhW2YrK10pOyk7cmV0dXJuIGF9LHRyaW06TmE/ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6TmEuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YS50b1N0cmluZygpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYyl7Yz1jfHxbXTtpZihudWxsIT0KYSl7dmFyIGQ9Yi50eXBlKGEpO251bGw9PWEubGVuZ3RofHwic3RyaW5nIj09PWR8fCJmdW5jdGlvbiI9PT1kfHwicmVnZXhwIj09PWR8fGIuaXNXaW5kb3coYSk/b2EuY2FsbChjLGEpOmIubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIpe2lmKCFiKXJldHVybi0xO2lmKHUpcmV0dXJuIHUuY2FsbChiLGEpO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihiW2NdPT09YSlyZXR1cm4gYztyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7aWYoIm51bWJlciI9PT10eXBlb2YgYi5sZW5ndGgpZm9yKHZhciBlPWIubGVuZ3RoO2Q8ZTtkKyspYVtjKytdPWJbZF07ZWxzZSBmb3IoO3ZvaWQgMCE9PWJbZF07KWFbYysrXT1iW2QrK107YS5sZW5ndGg9YztyZXR1cm4gYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZTtjPSEhYztmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspZT0hIWIoYVtmXSxmKSwKYyE9PWUmJmQucHVzaChhW2ZdKTtyZXR1cm4gZH0sbWFwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmLGc9W10sdj0wLHI9YS5sZW5ndGg7aWYoYSBpbnN0YW5jZW9mIGJ8fHZvaWQgMCE9PXImJiJudW1iZXIiPT09dHlwZW9mIHImJigwPHImJmFbMF0mJmFbci0xXXx8MD09PXJ8fGIuaXNBcnJheShhKSkpZm9yKDt2PHI7disrKWU9YyhhW3ZdLHYsZCksbnVsbCE9ZSYmKGdbZy5sZW5ndGhdPWUpO2Vsc2UgZm9yKGYgaW4gYSllPWMoYVtmXSxmLGQpLG51bGwhPWUmJihnW2cubGVuZ3RoXT1lKTtyZXR1cm4gZy5jb25jYXQuYXBwbHkoW10sZyl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMpe2lmKCJzdHJpbmciPT09dHlwZW9mIGMpe3ZhciBkPWFbY107Yz1hO2E9ZH1pZihiLmlzRnVuY3Rpb24oYSkpe3ZhciBlPU8uY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsZS5jb25jYXQoTy5jYWxsKGFyZ3VtZW50cykpKX07ZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fApkLmd1aWR8fGIuZ3VpZCsrO3JldHVybiBkfX0sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGUsZixnKXt2YXIgdj1hLmxlbmd0aDtpZigib2JqZWN0Ij09PXR5cGVvZiBjKXtmb3IodmFyIHIgaW4gYyliLmFjY2VzcyhhLHIsY1tyXSxlLGYsZCk7cmV0dXJuIGF9aWYodm9pZCAwIT09ZCl7ZT0hZyYmZSYmYi5pc0Z1bmN0aW9uKGQpO2ZvcihyPTA7cjx2O3IrKylmKGFbcl0sYyxlP2QuY2FsbChhW3JdLHIsZihhW3JdLGMpKTpkLGcpO3JldHVybiBhfXJldHVybiB2P2YoYVswXSxjKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSx1YU1hdGNoOmZ1bmN0aW9uKGEpe2E9YS50b0xvd2VyQ2FzZSgpO2E9eS5leGVjKGEpfHx6LmV4ZWMoYSl8fEEuZXhlYyhhKXx8MD5hLmluZGV4T2YoImNvbXBhdGlibGUiKSYmdi5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjphWzFdfHwiIix2ZXJzaW9uOmFbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYiwKYyl7cmV0dXJuIG5ldyBhLmZuLmluaXQoYixjKX1iLmV4dGVuZCghMCxhLHRoaXMpO2Euc3VwZXJjbGFzcz10aGlzO2EuZm49YS5wcm90b3R5cGU9dGhpcygpO2EuZm4uY29uc3RydWN0b3I9YTthLnN1Yj10aGlzLnN1YjthLmZuLmluaXQ9ZnVuY3Rpb24oZCxlKXtlJiZlIGluc3RhbmNlb2YgYiYmIShlIGluc3RhbmNlb2YgYSkmJihlPWEoZSkpO3JldHVybiBiLmZuLmluaXQuY2FsbCh0aGlzLGQsZSxjKX07YS5mbi5pbml0LnByb3RvdHlwZT1hLmZuO3ZhciBjPWEobSk7cmV0dXJuIGF9LGJyb3dzZXI6e319KTtiLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtIWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO1Y9Yi51YU1hdGNoKFYpO1YuYnJvd3NlciYmKGIuYnJvd3NlcltWLmJyb3dzZXJdPSEwLGIuYnJvd3Nlci52ZXJzaW9uPVYudmVyc2lvbik7Yi5icm93c2VyLndlYmtpdCYmCihiLmJyb3dzZXIuc2FmYXJpPSEwKTtoLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyk7Zj1iKG0pO20uYWRkRXZlbnRMaXN0ZW5lcj9VPWZ1bmN0aW9uKCl7bS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixVLCExKTtiLnJlYWR5KCl9Om0uYXR0YWNoRXZlbnQmJihVPWZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PW0ucmVhZHlTdGF0ZSYmKG0uZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsVSksYi5yZWFkeSgpKX0pO3JldHVybiBifSgpLHBhPSJkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UgdGhlbiBhbHdheXMgcGlwZSIuc3BsaXQoIiAiKSxPYT1bXS5zbGljZTtjLmV4dGVuZCh7X0RlZmVycmVkOmZ1bmN0aW9uKCl7dmFyIGE9W10sYixkLGUsZj17ZG9uZTpmdW5jdGlvbigpe2lmKCFlKXt2YXIgZD1hcmd1bWVudHMsaCxrLGwsbixwO2ImJihwPWIsYj0wKTtoPTA7Zm9yKGs9ZC5sZW5ndGg7aDwKaztoKyspbD1kW2hdLG49Yy50eXBlKGwpLCJhcnJheSI9PT1uP2YuZG9uZS5hcHBseShmLGwpOiJmdW5jdGlvbiI9PT1uJiZhLnB1c2gobCk7cCYmZi5yZXNvbHZlV2l0aChwWzBdLHBbMV0pfXJldHVybiB0aGlzfSxyZXNvbHZlV2l0aDpmdW5jdGlvbihjLGYpe2lmKCFlJiYhYiYmIWQpe2Y9Znx8W107ZD0xO3RyeXtmb3IoO2FbMF07KWEuc2hpZnQoKS5hcHBseShjLGYpfWZpbmFsbHl7Yj1bYyxmXSxkPTB9fXJldHVybiB0aGlzfSxyZXNvbHZlOmZ1bmN0aW9uKCl7Zi5yZXNvbHZlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGlzUmVzb2x2ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCFkJiYhYil9LGNhbmNlbDpmdW5jdGlvbigpe2U9MTthPVtdO3JldHVybiB0aGlzfX07cmV0dXJuIGZ9LERlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPWMuX0RlZmVycmVkKCksZD1jLl9EZWZlcnJlZCgpLGU7Yy5leHRlbmQoYix7dGhlbjpmdW5jdGlvbihhLGMpe2IuZG9uZShhKS5mYWlsKGMpOwpyZXR1cm4gdGhpc30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGIuZG9uZS5hcHBseShiLGFyZ3VtZW50cykuZmFpbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGZhaWw6ZC5kb25lLHJlamVjdFdpdGg6ZC5yZXNvbHZlV2l0aCxyZWplY3Q6ZC5yZXNvbHZlLGlzUmVqZWN0ZWQ6ZC5pc1Jlc29sdmVkLHBpcGU6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYy5EZWZlcnJlZChmdW5jdGlvbihlKXtjLmVhY2goe2RvbmU6W2EsInJlc29sdmUiXSxmYWlsOltkLCJyZWplY3QiXX0sZnVuY3Rpb24oYSxkKXt2YXIgZj1kWzBdLGc9ZFsxXSxtO2lmKGMuaXNGdW5jdGlvbihmKSliW2FdKGZ1bmN0aW9uKCl7aWYoKG09Zi5hcHBseSh0aGlzLGFyZ3VtZW50cykpJiZjLmlzRnVuY3Rpb24obS5wcm9taXNlKSltLnByb21pc2UoKS50aGVuKGUucmVzb2x2ZSxlLnJlamVjdCk7ZWxzZSBlW2crIldpdGgiXSh0aGlzPT09Yj9lOnRoaXMsW21dKX0pO2Vsc2UgYlthXShlW2ddKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKG51bGw9PQphKXtpZihlKXJldHVybiBlO2U9YT17fX1mb3IodmFyIGM9cGEubGVuZ3RoO2MtLTspYVtwYVtjXV09YltwYVtjXV07cmV0dXJuIGF9fSk7Yi5kb25lKGQuY2FuY2VsKS5mYWlsKGIuY2FuY2VsKTtkZWxldGUgYi5jYW5jZWw7YSYmYS5jYWxsKGIsYik7cmV0dXJuIGJ9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7ZFthXT0xPGFyZ3VtZW50cy5sZW5ndGg/T2EuY2FsbChhcmd1bWVudHMsMCk6YjstLWd8fGgucmVzb2x2ZVdpdGgoaCxPYS5jYWxsKGQsMCkpfX12YXIgZD1hcmd1bWVudHMsZT0wLGY9ZC5sZW5ndGgsZz1mLGg9MT49ZiYmYSYmYy5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpjLkRlZmVycmVkKCk7aWYoMTxmKXtmb3IoO2U8ZjtlKyspZFtlXSYmYy5pc0Z1bmN0aW9uKGRbZV0ucHJvbWlzZSk/ZFtlXS5wcm9taXNlKCkudGhlbihiKGUpLGgucmVqZWN0KTotLWc7Z3x8aC5yZXNvbHZlV2l0aChoLGQpfWVsc2UgaCE9PWEmJmgucmVzb2x2ZVdpdGgoaCwKZj9bYV06W10pO3JldHVybiBoLnByb21pc2UoKX19KTtjLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYT1tLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGI9bS5kb2N1bWVudEVsZW1lbnQsZCxlLGYsZyxoLGs7YS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKTthLmlubmVySFRNTD0iICAgXHgzY2xpbmsvXHgzZVx4M2N0YWJsZVx4M2VceDNjL3RhYmxlXHgzZVx4M2NhIGhyZWZceDNkJy9hJyBzdHlsZVx4M2QndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1OydceDNlYVx4M2MvYVx4M2VceDNjaW5wdXQgdHlwZVx4M2QnY2hlY2tib3gnL1x4M2UiO2Q9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2U9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCFkfHwhZC5sZW5ndGh8fCFlKXJldHVybnt9O2Y9bS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTtnPWYuYXBwZW5kQ2hpbGQobS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7ZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdOwpoPXtsZWFkaW5nV2hpdGVzcGFjZTozPT09YS5maXJzdENoaWxkLm5vZGVUeXBlLHRib2R5OiFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDoiL2EiPT09ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxvcGFjaXR5Oi9eMC41NSQvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjoib24iPT09ZC52YWx1ZSxvcHRTZWxlY3RlZDpnLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZToidCIhPT1hLmNsYXNzTmFtZSxzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLApyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfTtkLmNoZWNrZWQ9ITA7aC5ub0Nsb25lQ2hlY2tlZD1kLmNsb25lTm9kZSghMCkuY2hlY2tlZDtmLmRpc2FibGVkPSEwO2gub3B0RGlzYWJsZWQ9IWcuZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2gobCl7aC5kZWxldGVFeHBhbmRvPSExfSFhLmFkZEV2ZW50TGlzdGVuZXImJmEuYXR0YWNoRXZlbnQmJmEuZmlyZUV2ZW50JiYoYS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtoLm5vQ2xvbmVFdmVudD0hMX0pLGEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSk7ZD1tLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ZC52YWx1ZT0idCI7ZC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpO2gucmFkaW9WYWx1ZT0idCI9PT1kLnZhbHVlO2Quc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpO2EuYXBwZW5kQ2hpbGQoZCk7ZT1tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtlLmFwcGVuZENoaWxkKGEuZmlyc3RDaGlsZCk7CmguY2hlY2tDbG9uZT1lLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZDthLmlubmVySFRNTD0iIjthLnN0eWxlLndpZHRoPWEuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCI7Zj1tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07ZT1tLmNyZWF0ZUVsZW1lbnQoZj8iZGl2IjoiYm9keSIpO2c9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MCxiYWNrZ3JvdW5kOiJub25lIn07ZiYmYy5leHRlbmQoZyx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiItMTAwMHB4Iix0b3A6Ii0xMDAwcHgifSk7Zm9yKGsgaW4gZyllLnN0eWxlW2tdPWdba107ZS5hcHBlbmRDaGlsZChhKTtiPWZ8fGI7Yi5pbnNlcnRCZWZvcmUoZSxiLmZpcnN0Q2hpbGQpO2guYXBwZW5kQ2hlY2tlZD1kLmNoZWNrZWQ7Yy5ib3hNb2RlbD1oLmJveE1vZGVsPSJDU1MxQ29tcGF0Ij09PW0uY29tcGF0TW9kZTsiem9vbSJpbiBhLnN0eWxlJiYKKGEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixhLnN0eWxlLnpvb209MSxoLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9Mj09PWEub2Zmc2V0V2lkdGgsYS5zdHlsZS5kaXNwbGF5PSIiLGEuaW5uZXJIVE1MPSJceDNjZGl2IHN0eWxlXHgzZCd3aWR0aDo0cHg7J1x4M2VceDNjL2Rpdlx4M2UiLGguc2hyaW5rV3JhcEJsb2Nrcz0yIT09YS5vZmZzZXRXaWR0aCk7YS5pbm5lckhUTUw9Ilx4M2N0YWJsZVx4M2VceDNjdHJceDNlXHgzY3RkIHN0eWxlXHgzZCdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJ1x4M2VceDNjL3RkXHgzZVx4M2N0ZFx4M2V0XHgzYy90ZFx4M2VceDNjL3RyXHgzZVx4M2MvdGFibGVceDNlIjtmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7ZD0wPT09ZlswXS5vZmZzZXRIZWlnaHQ7ZlswXS5zdHlsZS5kaXNwbGF5PSIiO2ZbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7aC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9ZCYmMD09PWZbMF0ub2Zmc2V0SGVpZ2h0OwphLmlubmVySFRNTD0iIjttLmRlZmF1bHRWaWV3JiZtLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihkPW0uY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS53aWR0aD0iMCIsZC5zdHlsZS5tYXJnaW5SaWdodD0iMCIsYS5hcHBlbmRDaGlsZChkKSxoLnJlbGlhYmxlTWFyZ2luUmlnaHQ9MD09PShwYXJzZUludCgobS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCl8fHttYXJnaW5SaWdodDowfSkubWFyZ2luUmlnaHQsMTApfHwwKSk7ZS5pbm5lckhUTUw9IiI7Yi5yZW1vdmVDaGlsZChlKTtpZihhLmF0dGFjaEV2ZW50KWZvcihrIGlue3N1Ym1pdDoxLGNoYW5nZToxLGZvY3VzaW46MX0pYj0ib24iK2ssZD1iIGluIGEsZHx8KGEuc2V0QXR0cmlidXRlKGIsInJldHVybjsiKSxkPSJmdW5jdGlvbiI9PT10eXBlb2YgYVtiXSksaFtrKyJCdWJibGVzIl09ZDtlPWU9Zj1nPWY9ZD1hPWQ9bnVsbDtyZXR1cm4gaH0oKTt2YXIgamI9L14oPzpcey4qXH18XFsuKlxdKSQvLAppYj0vKFtBLVpdKS9nO2MuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoYy5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9jLmNhY2hlW2FbYy5leHBhbmRvXV06YVtjLmV4cGFuZG9dO3JldHVybiEhYSYmIUwoYSl9LGRhdGE6ZnVuY3Rpb24oYSxiLGQsZSl7aWYoYy5hY2NlcHREYXRhKGEpKXt2YXIgZj1jLmV4cGFuZG8sZz0ic3RyaW5nIj09PXR5cGVvZiBiLGg9YS5ub2RlVHlwZSxrPWg/Yy5jYWNoZTphLGw9aD9hW2MuZXhwYW5kb106YVtjLmV4cGFuZG9dJiZjLmV4cGFuZG87aWYoISghbHx8ZSYmbCYma1tsXSYmIWtbbF1bZl0pfHwhZ3x8dm9pZCAwIT09ZCl7bHx8KGg/YVtjLmV4cGFuZG9dPWw9KytjLnV1aWQ6bD1jLmV4cGFuZG8pOwprW2xdfHwoa1tsXT17fSxofHwoa1tsXS50b0pTT049Yy5ub29wKSk7aWYoIm9iamVjdCI9PT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09PXR5cGVvZiBiKWU/a1tsXVtmXT1jLmV4dGVuZChrW2xdW2ZdLGIpOmtbbF09Yy5leHRlbmQoa1tsXSxiKTthPWtbbF07ZSYmKGFbZl18fChhW2ZdPXt9KSxhPWFbZl0pO3ZvaWQgMCE9PWQmJihhW2MuY2FtZWxDYXNlKGIpXT1kKTtpZigiZXZlbnRzIj09PWImJiFhW2JdKXJldHVybiBhW2ZdJiZhW2ZdLmV2ZW50cztnPyhkPWFbYl0sbnVsbD09ZCYmKGQ9YVtjLmNhbWVsQ2FzZShiKV0pKTpkPWE7cmV0dXJuIGR9fX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsZCl7aWYoYy5hY2NlcHREYXRhKGEpKXt2YXIgZSxmPWMuZXhwYW5kbyxnPWEubm9kZVR5cGUsaD1nP2MuY2FjaGU6YSxrPWc/YVtjLmV4cGFuZG9dOmMuZXhwYW5kbztpZihoW2tdKXtpZihiJiYoZT1kP2hba11bZl06aFtrXSkmJihlW2JdfHwoYj1jLmNhbWVsQ2FzZShiKSksZGVsZXRlIGVbYl0sCiFMKGUpKXx8ZCYmKGRlbGV0ZSBoW2tdW2ZdLCFMKGhba10pKSlyZXR1cm47Yj1oW2tdW2ZdO2Muc3VwcG9ydC5kZWxldGVFeHBhbmRvfHwhaC5zZXRJbnRlcnZhbD9kZWxldGUgaFtrXTpoW2tdPW51bGw7Yj8oaFtrXT17fSxnfHwoaFtrXS50b0pTT049Yy5ub29wKSxoW2tdW2ZdPWIpOmcmJihjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYVtjLmV4cGFuZG9dOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk6YVtjLmV4cGFuZG9dPW51bGwpfX19LF9kYXRhOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kYXRhKGEsYixkLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1jLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuISghMD09PWJ8fGEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIikhPT1iKX1yZXR1cm4hMH19KTtjLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGIpe3ZhciBkPQpudWxsO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGEpe2lmKHRoaXMubGVuZ3RoJiYoZD1jLmRhdGEodGhpc1swXSksMT09PXRoaXNbMF0ubm9kZVR5cGUpKWZvcih2YXIgZT10aGlzWzBdLmF0dHJpYnV0ZXMsZixnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXS5uYW1lLDA9PT1mLmluZGV4T2YoImRhdGEtIikmJihmPWMuY2FtZWxDYXNlKGYuc3Vic3RyaW5nKDUpKSxEKHRoaXNbMF0sZixkW2ZdKSk7cmV0dXJuIGR9aWYoIm9iamVjdCI9PT10eXBlb2YgYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kYXRhKHRoaXMsYSl9KTt2YXIgaz1hLnNwbGl0KCIuIik7a1sxXT1rWzFdPyIuIitrWzFdOiIiO3JldHVybiB2b2lkIDA9PT1iPyhkPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2tbMV0rIiEiLFtrWzBdXSksdm9pZCAwPT09ZCYmdGhpcy5sZW5ndGgmJihkPWMuZGF0YSh0aGlzWzBdLGEpLGQ9RCh0aGlzWzBdLGEsZCkpLHZvaWQgMD09PWQmJmtbMV0/dGhpcy5kYXRhKGtbMF0pOgpkKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1jKHRoaXMpLGU9W2tbMF0sYl07ZC50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIra1sxXSsiISIsZSk7Yy5kYXRhKHRoaXMsYSxiKTtkLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitrWzFdKyIhIixlKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pO2MuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsYy5kYXRhKGEsYiwoYy5kYXRhKGEsYix2b2lkIDAsITApfHwwKSsxLCEwKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxiLGQpeyEwIT09YSYmKGQ9YixiPWEsYT0hMSk7aWYoYil7ZD1kfHwiZngiO3ZhciBlPWQrIm1hcmsiOyhhPWE/MDooYy5kYXRhKGIsZSx2b2lkIDAsITApfHwxKS0xKT9jLmRhdGEoYixlLGEsITApOihjLnJlbW92ZURhdGEoYixlLCEwKSx3YShiLGQsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLApiLGQpe2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSI7dmFyIGU9Yy5kYXRhKGEsYix2b2lkIDAsITApO2QmJighZXx8Yy5pc0FycmF5KGQpP2U9Yy5kYXRhKGEsYixjLm1ha2VBcnJheShkKSwhMCk6ZS5wdXNoKGQpKTtyZXR1cm4gZXx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBkPWMucXVldWUoYSxiKSxlPWQuc2hpZnQoKTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1kLnNoaWZ0KCkpO2UmJigiZngiPT09YiYmZC51bnNoaWZ0KCJpbnByb2dyZXNzIiksZS5jYWxsKGEsZnVuY3Rpb24oKXtjLmRlcXVldWUoYSxiKX0pKTtkLmxlbmd0aHx8KGMucmVtb3ZlRGF0YShhLGIrInF1ZXVlIiwhMCksd2EoYSxiLCJxdWV1ZSIpKX19KTtjLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXsic3RyaW5nIiE9PXR5cGVvZiBhJiYoYj1hLGE9ImZ4Iik7cmV0dXJuIHZvaWQgMD09PWI/Yy5xdWV1ZSh0aGlzWzBdLGEpOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWMucXVldWUodGhpcywKYSxiKTsiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09ZFswXSYmYy5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWMuZng/Yy5meC5zcGVlZHNbYV18fGE6YTtiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbigpe3ZhciBkPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2MuZGVxdWV1ZShkLGIpfSxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZCgpey0tZ3x8ZS5yZXNvbHZlV2l0aChmLFtmXSl9InN0cmluZyIhPT10eXBlb2YgYSYmKGE9dm9pZCAwKTthPWF8fCJmeCI7dmFyIGU9Yy5EZWZlcnJlZCgpLGY9dGhpcztiPWYubGVuZ3RoO3ZhciBnPTEsaD1hKyJkZWZlciIsaz1hKyJxdWV1ZSI7YSs9Im1hcmsiOwpmb3IodmFyIGw7Yi0tOylpZihsPWMuZGF0YShmW2JdLGgsdm9pZCAwLCEwKXx8KGMuZGF0YShmW2JdLGssdm9pZCAwLCEwKXx8Yy5kYXRhKGZbYl0sYSx2b2lkIDAsITApKSYmYy5kYXRhKGZbYl0saCxjLl9EZWZlcnJlZCgpLCEwKSlnKyssbC5kb25lKGQpO2QoKTtyZXR1cm4gZS5wcm9taXNlKCl9fSk7dmFyIFBhPS9bXG5cdFxyXS9nLHFhPS9ccysvLHliPS9cci9nLHpiPS9eKD86YnV0dG9ufGlucHV0KSQvaSxBYj0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxCYj0vXmEoPzpyZWEpPyQvaSxRYT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSxJLFJhO2MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuYWNjZXNzKHRoaXMsYSxiLCEwLGMuYXR0cil9LApyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZUF0dHIodGhpcyxhKX0pfSxwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuYWNjZXNzKHRoaXMsYSxiLCEwLGMucHJvcCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7YT1jLnByb3BGaXhbYV18fGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmLGcsaCxrO2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2ModGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmInN0cmluZyI9PT10eXBlb2YgYSlmb3IoYj1hLnNwbGl0KHFhKSxkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKWlmKGY9dGhpc1tkXSwxPT09Zi5ub2RlVHlwZSlpZihmLmNsYXNzTmFtZXx8MSE9PQpiLmxlbmd0aCl7Zz0iICIrZi5jbGFzc05hbWUrIiAiO2g9MDtmb3Ioaz1iLmxlbmd0aDtoPGs7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtmLmNsYXNzTmFtZT1jLnRyaW0oZyl9ZWxzZSBmLmNsYXNzTmFtZT1hO3JldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixkLGUsZixnLGgsaztpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJiJzdHJpbmciPT09dHlwZW9mIGF8fHZvaWQgMD09PWEpZm9yKGI9KGF8fCIiKS5zcGxpdChxYSksZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKylpZihmPXRoaXNbZF0sMT09PWYubm9kZVR5cGUmJmYuY2xhc3NOYW1lKWlmKGEpe2c9KCIgIitmLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoUGEsIiAiKTtoPTA7Zm9yKGs9Yi5sZW5ndGg7aDxrO2grKylnPWcucmVwbGFjZSgiICIrCmJbaF0rIiAiLCIgIik7Zi5jbGFzc05hbWU9Yy50cmltKGcpfWVsc2UgZi5jbGFzc05hbWU9IiI7cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGEsZT0iYm9vbGVhbiI9PT10eXBlb2YgYjtyZXR1cm4gYy5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihkKXtjKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGQsdGhpcy5jbGFzc05hbWUsYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtpZigic3RyaW5nIj09PWQpZm9yKHZhciBmLGc9MCxoPWModGhpcyksaz1iLGw9YS5zcGxpdChxYSk7Zj1sW2crK107KWs9ZT9rOiFoLmhhc0NsYXNzKGYpLGhbaz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGYpO2Vsc2UgaWYoInVuZGVmaW5lZCI9PT1kfHwiYm9vbGVhbiI9PT1kKXRoaXMuY2xhc3NOYW1lJiZjLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8CiExPT09YT8iIjpjLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsYz10aGlzLmxlbmd0aDtiPGM7YisrKWlmKDE9PT10aGlzW2JdLm5vZGVUeXBlJiYtMTwoIiAiK3RoaXNbYl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShQYSwiICIpLmluZGV4T2YoYSkpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYixkLGU9dGhpc1swXTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZj1jLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZT1jKHRoaXMpOzE9PT10aGlzLm5vZGVUeXBlJiYoZD1mP2EuY2FsbCh0aGlzLGQsZS52YWwoKSk6YSxudWxsPT1kP2Q9IiI6Im51bWJlciI9PT10eXBlb2YgZD9kKz0iIjpjLmlzQXJyYXkoZCkmJihkPWMubWFwKGQsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPWMudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8CmMudmFsSG9va3NbdGhpcy50eXBlXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZCwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZCkpfSl9aWYoZSl7aWYoKGI9Yy52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldfHxjLnZhbEhvb2tzW2UudHlwZV0pJiYiZ2V0ImluIGImJnZvaWQgMCE9PShkPWIuZ2V0KGUsInZhbHVlIikpKXJldHVybiBkO2Q9ZS52YWx1ZTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2QucmVwbGFjZSh5YiwiIik6bnVsbD09ZD8iIjpkfX19KTtjLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixkPWEuc2VsZWN0ZWRJbmRleCxlPVtdLGY9YS5vcHRpb25zO2E9InNlbGVjdC1vbmUiPT09YS50eXBlO2lmKDA+ZClyZXR1cm4gbnVsbDtmb3IodmFyIGc9CmE/ZDowLGg9YT9kKzE6Zi5sZW5ndGg7ZzxoO2crKylpZihiPWZbZ10sISghYi5zZWxlY3RlZHx8KGMuc3VwcG9ydC5vcHREaXNhYmxlZD9iLmRpc2FibGVkOm51bGwhPT1iLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fGIucGFyZW50Tm9kZS5kaXNhYmxlZCYmYy5ub2RlTmFtZShiLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtiPWMoYikudmFsKCk7aWYoYSlyZXR1cm4gYjtlLnB1c2goYil9cmV0dXJuIGEmJiFlLmxlbmd0aCYmZi5sZW5ndGg/YyhmW2RdKS52YWwoKTplfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLm1ha2VBcnJheShiKTtjKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPTA8PWMuaW5BcnJheShjKHRoaXMpLnZhbCgpLGQpfSk7ZC5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBkfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSwKYXR0ckZpeDp7dGFiaW5kZXg6InRhYkluZGV4In0sYXR0cjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLm5vZGVUeXBlO2lmKGEmJjMhPT1mJiY4IT09ZiYmMiE9PWYpe2lmKGUmJmIgaW4gYy5hdHRyRm4pcmV0dXJuIGMoYSlbYl0oZCk7aWYoISgiZ2V0QXR0cmlidXRlImluIGEpKXJldHVybiBjLnByb3AoYSxiLGQpO3ZhciBnLGg7aWYoZT0xIT09Znx8IWMuaXNYTUxEb2MoYSkpYj1jLmF0dHJGaXhbYl18fGIsKGg9Yy5hdHRySG9va3NbYl0pfHwoUWEudGVzdChiKT9oPVJhOkkmJihoPUkpKTtpZih2b2lkIDAhPT1kKXtpZihudWxsPT09ZCl7Yy5yZW1vdmVBdHRyKGEsYik7cmV0dXJufWlmKGgmJiJzZXQiaW4gaCYmZSYmdm9pZCAwIT09KGc9aC5zZXQoYSxkLGIpKSlyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShiLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmZSYmbnVsbCE9PShnPWguZ2V0KGEsYikpKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIG51bGw9PT0KZz92b2lkIDA6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgZDsxPT09YS5ub2RlVHlwZSYmKGI9Yy5hdHRyRml4W2JdfHxiLGMuYXR0cihhLGIsIiIpLGEucmVtb3ZlQXR0cmlidXRlKGIpLFFhLnRlc3QoYikmJihkPWMucHJvcEZpeFtiXXx8YilpbiBhJiYoYVtkXT0hMSkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKHpiLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSljLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFjLnN1cHBvcnQucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJmMubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGQ9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYik7ZCYmKGEudmFsdWU9ZCk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBJJiZjLm5vZGVOYW1lKGEsImJ1dHRvbiIpP0kuZ2V0KGEsYik6YiBpbiBhP2EudmFsdWU6bnVsbH0sCnNldDpmdW5jdGlvbihhLGIsZCl7aWYoSSYmYy5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gSS5zZXQoYSxiLGQpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEubm9kZVR5cGU7aWYoYSYmMyE9PWUmJjghPT1lJiYyIT09ZSl7dmFyIGYsZzsxPT09ZSYmYy5pc1hNTERvYyhhKXx8KGI9Yy5wcm9wRml4W2JdfHxiLGc9Yy5wcm9wSG9va3NbYl0pO3JldHVybiB2b2lkIDAhPT0KZD9nJiYic2V0ImluIGcmJnZvaWQgMCE9PShmPWcuc2V0KGEsZCxiKSk/ZjphW2JdPWQ6ZyYmImdldCJpbiBnJiZudWxsIT09KGY9Zy5nZXQoYSxiKSk/ZjphW2JdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYiYmYi5zcGVjaWZpZWQ/cGFyc2VJbnQoYi52YWx1ZSwxMCk6QWIudGVzdChhLm5vZGVOYW1lKXx8QmIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6dm9pZCAwfX19fSk7Yy5hdHRySG9va3MudGFiSW5kZXg9Yy5wcm9wSG9va3MudGFiSW5kZXg7UmE9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBkO3JldHVybiEwPT09Yy5wcm9wKGEsYil8fChkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiExIT09ZC5ub2RlVmFsdWU/Yi50b0xvd2VyQ2FzZSgpOnZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYixkKXshMT09PWI/Yy5yZW1vdmVBdHRyKGEsZCk6KGI9Yy5wcm9wRml4W2RdfHxkLApiIGluIGEmJihhW2JdPSEwKSxhLnNldEF0dHJpYnV0ZShkLGQudG9Mb3dlckNhc2UoKSkpO3JldHVybiBkfX07Yy5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZXx8KEk9Yy52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGIpe3JldHVybihhPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09YS5ub2RlVmFsdWU/YS5ub2RlVmFsdWU6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtlfHwoZT1tLmNyZWF0ZUF0dHJpYnV0ZShjKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sYy5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2MuYXR0ckhvb2tzW2JdPWMuZXh0ZW5kKGMuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZigiIj09PWMpcmV0dXJuIGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjfX0pfSkpO2Muc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Yy5lYWNoKFsiaHJlZiIsCiJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Yy5hdHRySG9va3NbYl09Yy5leHRlbmQoYy5hdHRySG9va3NbYl0se2dldDpmdW5jdGlvbihhKXthPWEuZ2V0QXR0cmlidXRlKGIsMik7cmV0dXJuIG51bGw9PT1hP3ZvaWQgMDphfX0pfSk7Yy5zdXBwb3J0LnN0eWxlfHwoYy5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pO2Muc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGMucHJvcEhvb2tzLnNlbGVjdGVkPWMuZXh0ZW5kKGMucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7aWYoYT1hLnBhcmVudE5vZGUpYS5zZWxlY3RlZEluZGV4LGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIG51bGx9fSkpO2Muc3VwcG9ydC5jaGVja09ufHxjLmVhY2goWyJyYWRpbyIsCiJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Yy52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfX19KTtjLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtjLnZhbEhvb2tzW3RoaXNdPWMuZXh0ZW5kKGMudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGMuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPTA8PWMuaW5BcnJheShjKGEpLnZhbCgpLGIpfX0pfSk7dmFyIGlhPS9cLiguKikkLyxyYT0vXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksbGI9L1wuL2csbWI9LyAvZyxDYj0vW15cd1xzLnxgXS9nLERiPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoQ2IsIlxcJFx4MjYiKX07Yy5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYixkLGUpe2lmKDMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSl7aWYoITE9PT1kKWQ9RTtlbHNlIGlmKCFkKXJldHVybjsKdmFyIGYsZztkLmhhbmRsZXImJihmPWQsZD1mLmhhbmRsZXIpO2QuZ3VpZHx8KGQuZ3VpZD1jLmd1aWQrKyk7aWYoZz1jLl9kYXRhKGEpKXt2YXIgaD1nLmV2ZW50cyxrPWcuaGFuZGxlO2h8fChnLmV2ZW50cz1oPXt9KTtrfHwoZy5oYW5kbGU9az1mdW5jdGlvbihhKXtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBjfHxhJiZjLmV2ZW50LnRyaWdnZXJlZD09PWEudHlwZT92b2lkIDA6Yy5ldmVudC5oYW5kbGUuYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9KTtrLmVsZW09YTtiPWIuc3BsaXQoIiAiKTtmb3IodmFyIGwsbj0wLHA7bD1iW24rK107KXtnPWY/Yy5leHRlbmQoe30sZik6e2hhbmRsZXI6ZCxkYXRhOmV9Oy0xPGwuaW5kZXhPZigiLiIpPyhwPWwuc3BsaXQoIi4iKSxsPXAuc2hpZnQoKSxnLm5hbWVzcGFjZT1wLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIikpOihwPVtdLGcubmFtZXNwYWNlPSIiKTtnLnR5cGU9bDtnLmd1aWR8fChnLmd1aWQ9ZC5ndWlkKTt2YXIgbT1oW2xdLApxPWMuZXZlbnQuc3BlY2lhbFtsXXx8e307bXx8KG09aFtsXT1bXSxxLnNldHVwJiYhMSE9PXEuc2V0dXAuY2FsbChhLGUscCxrKXx8KGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobCxrLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxrKSkpO3EuYWRkJiYocS5hZGQuY2FsbChhLGcpLGcuaGFuZGxlci5ndWlkfHwoZy5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSk7bS5wdXNoKGcpO2MuZXZlbnQuZ2xvYmFsW2xdPSEwfWE9bnVsbH19fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixkLGUpe2lmKDMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSl7ITE9PT1kJiYoZD1FKTt2YXIgZixnLGg9MCxrLGwsbixwLG0scSx0PWMuaGFzRGF0YShhKSYmYy5fZGF0YShhKSx3PXQmJnQuZXZlbnRzO2lmKHQmJncpaWYoYiYmYi50eXBlJiYoZD1iLmhhbmRsZXIsYj1iLnR5cGUpLCFifHwic3RyaW5nIj09PXR5cGVvZiBiJiYiLiI9PT1iLmNoYXJBdCgwKSlmb3IoZiBpbiBiPQpifHwiIix3KWMuZXZlbnQucmVtb3ZlKGEsZitiKTtlbHNle2ZvcihiPWIuc3BsaXQoIiAiKTtmPWJbaCsrXTspaWYocD1mLGs9MD5mLmluZGV4T2YoIi4iKSxsPVtdLGt8fChsPWYuc3BsaXQoIi4iKSxmPWwuc2hpZnQoKSxuPW5ldyBSZWdFeHAoIihefFxcLikiK2MubWFwKGwuc2xpY2UoMCkuc29ydCgpLERiKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKSksbT13W2ZdKWlmKGQpe3A9Yy5ldmVudC5zcGVjaWFsW2ZdfHx7fTtmb3IoZz1lfHwwO2c8bS5sZW5ndGg7ZysrKWlmKHE9bVtnXSxkLmd1aWQ9PT1xLmd1aWQpe2lmKGt8fG4udGVzdChxLm5hbWVzcGFjZSkpbnVsbD09ZSYmbS5zcGxpY2UoZy0tLDEpLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEscSk7aWYobnVsbCE9ZSlicmVha31pZigwPT09bS5sZW5ndGh8fG51bGwhPWUmJjE9PT1tLmxlbmd0aClwLnRlYXJkb3duJiYhMSE9PXAudGVhcmRvd24uY2FsbChhLGwpfHxjLnJlbW92ZUV2ZW50KGEsZix0LmhhbmRsZSksCmRlbGV0ZSB3W2ZdfWVsc2UgZm9yKGc9MDtnPG0ubGVuZ3RoO2crKylpZihxPW1bZ10sa3x8bi50ZXN0KHEubmFtZXNwYWNlKSljLmV2ZW50LnJlbW92ZShhLHAscS5oYW5kbGVyLGcpLG0uc3BsaWNlKGctLSwxKTtpZihjLmlzRW1wdHlPYmplY3Qodykpe2lmKGI9dC5oYW5kbGUpYi5lbGVtPW51bGw7ZGVsZXRlIHQuZXZlbnRzO2RlbGV0ZSB0LmhhbmRsZTtjLmlzRW1wdHlPYmplY3QodCkmJmMucmVtb3ZlRGF0YShhLHZvaWQgMCwhMCl9fX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLnR5cGV8fGEsZz1bXSxoOzA8PWYuaW5kZXhPZigiISIpJiYoZj1mLnNsaWNlKDAsLTEpLGg9ITApOzA8PWYuaW5kZXhPZigiLiIpJiYoZz1mLnNwbGl0KCIuIiksZj1nLnNoaWZ0KCksZy5zb3J0KCkpO2lmKGQmJiFjLmV2ZW50LmN1c3RvbUV2ZW50W2ZdfHxjLmV2ZW50Lmdsb2JhbFtmXSl7YT0KIm9iamVjdCI9PT10eXBlb2YgYT9hW2MuZXhwYW5kb10/YTpuZXcgYy5FdmVudChmLGEpOm5ldyBjLkV2ZW50KGYpO2EudHlwZT1mO2EuZXhjbHVzaXZlPWg7YS5uYW1lc3BhY2U9Zy5qb2luKCIuIik7YS5uYW1lc3BhY2VfcmU9bmV3IFJlZ0V4cCgiKF58XFwuKSIrZy5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTtpZihlfHwhZClhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKTtpZighZCljLmVhY2goYy5jYWNoZSxmdW5jdGlvbigpe3ZhciBkPXRoaXNbYy5leHBhbmRvXTtkJiZkLmV2ZW50cyYmZC5ldmVudHNbZl0mJmMuZXZlbnQudHJpZ2dlcihhLGIsZC5oYW5kbGUuZWxlbSl9KTtlbHNlIGlmKDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSl7YS5yZXN1bHQ9dm9pZCAwO2EudGFyZ2V0PWQ7Yj1udWxsIT1iP2MubWFrZUFycmF5KGIpOltdO2IudW5zaGlmdChhKTtnPWQ7ZT0wPmYuaW5kZXhPZigiOiIpPyJvbiIrZjoiIjtkbyBoPWMuX2RhdGEoZywKImhhbmRsZSIpLGEuY3VycmVudFRhcmdldD1nLGgmJmguYXBwbHkoZyxiKSxlJiZjLmFjY2VwdERhdGEoZykmJmdbZV0mJiExPT09Z1tlXS5hcHBseShnLGIpJiYoYS5yZXN1bHQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKSxnPWcucGFyZW50Tm9kZXx8Zy5vd25lckRvY3VtZW50fHxnPT09YS50YXJnZXQub3duZXJEb2N1bWVudCYmcTt3aGlsZShnJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKTtpZighYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGssZz1jLmV2ZW50LnNwZWNpYWxbZl18fHt9O2lmKCEoZy5fZGVmYXVsdCYmITEhPT1nLl9kZWZhdWx0LmNhbGwoZC5vd25lckRvY3VtZW50LGEpfHwiY2xpY2siPT09ZiYmYy5ub2RlTmFtZShkLCJhIikpJiZjLmFjY2VwdERhdGEoZCkpe3RyeXtlJiZkW2ZdJiYoKGs9ZFtlXSkmJihkW2VdPW51bGwpLGMuZXZlbnQudHJpZ2dlcmVkPWYsZFtmXSgpKX1jYXRjaChsKXt9ayYmKGRbZV09ayk7Yy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwfX1yZXR1cm4gYS5yZXN1bHR9fX0sCmhhbmRsZTpmdW5jdGlvbihhKXthPWMuZXZlbnQuZml4KGF8fHEuZXZlbnQpO3ZhciBiPSgoYy5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2EudHlwZV18fFtdKS5zbGljZSgwKSxkPSFhLmV4Y2x1c2l2ZSYmIWEubmFtZXNwYWNlLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO2VbMF09YTthLmN1cnJlbnRUYXJnZXQ9dGhpcztmb3IodmFyIGY9MCxnPWIubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWJbZl07aWYoZHx8YS5uYW1lc3BhY2VfcmUudGVzdChoLm5hbWVzcGFjZSkpaWYoYS5oYW5kbGVyPWguaGFuZGxlcixhLmRhdGE9aC5kYXRhLGEuaGFuZGxlT2JqPWgsaD1oLmhhbmRsZXIuYXBwbHkodGhpcyxlKSx2b2lkIDAhPT1oJiYoYS5yZXN1bHQ9aCwhMT09PWgmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpLGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha31yZXR1cm4gYS5yZXN1bHR9LHByb3BzOiJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbGF5ZXJYIGxheWVyWSBtZXRhS2V5IG5ld1ZhbHVlIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKZml4OmZ1bmN0aW9uKGEpe2lmKGFbYy5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYj1hO2E9Yy5FdmVudChiKTtmb3IodmFyIGQ9dGhpcy5wcm9wcy5sZW5ndGgsZTtkOyllPXRoaXMucHJvcHNbLS1kXSxhW2VdPWJbZV07YS50YXJnZXR8fChhLnRhcmdldD1hLnNyY0VsZW1lbnR8fG0pOzM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpOyFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQmJihhLnJlbGF0ZWRUYXJnZXQ9YS5mcm9tRWxlbWVudD09PWEudGFyZ2V0P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQpO251bGw9PWEucGFnZVgmJm51bGwhPWEuY2xpZW50WCYmKGQ9YS50YXJnZXQub3duZXJEb2N1bWVudHx8bSxiPWQuZG9jdW1lbnRFbGVtZW50LGQ9ZC5ib2R5LGEucGFnZVg9YS5jbGllbnRYKyhiJiZiLnNjcm9sbExlZnR8fGQmJmQuc2Nyb2xsTGVmdHx8MCktKGImJmIuY2xpZW50TGVmdHx8ZCYmZC5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPQphLmNsaWVudFkrKGImJmIuc2Nyb2xsVG9wfHxkJiZkLnNjcm9sbFRvcHx8MCktKGImJmIuY2xpZW50VG9wfHxkJiZkLmNsaWVudFRvcHx8MCkpO251bGwhPWEud2hpY2h8fG51bGw9PWEuY2hhckNvZGUmJm51bGw9PWEua2V5Q29kZXx8KGEud2hpY2g9bnVsbCE9YS5jaGFyQ29kZT9hLmNoYXJDb2RlOmEua2V5Q29kZSk7IWEubWV0YUtleSYmYS5jdHJsS2V5JiYoYS5tZXRhS2V5PWEuY3RybEtleSk7YS53aGljaHx8dm9pZCAwPT09YS5idXR0b258fChhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjApO3JldHVybiBhfSxndWlkOjFFOCxwcm94eTpjLnByb3h5LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpjLmJpbmRSZWFkeSx0ZWFyZG93bjpjLm5vb3B9LGxpdmU6e2FkZDpmdW5jdGlvbihhKXtjLmV2ZW50LmFkZCh0aGlzLFooYS5vcmlnVHlwZSxhLnNlbGVjdG9yKSxjLmV4dGVuZCh7fSxhLHtoYW5kbGVyOmtiLGd1aWQ6YS5oYW5kbGVyLmd1aWR9KSl9LApyZW1vdmU6ZnVuY3Rpb24oYSl7Yy5ldmVudC5yZW1vdmUodGhpcyxaKGEub3JpZ1R5cGUsYS5zZWxlY3RvciksYSl9fSxiZWZvcmV1bmxvYWQ6e2FtYXpvbk9yaWdpbmFsOm51bGwsc2V0dXA6ZnVuY3Rpb24oYSxiLGQpe2lmKGMuaXNXaW5kb3codGhpcykpe3ZhciBlPWZ1bmN0aW9uKCl7fTsiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMub25iZWZvcmV1bmxvYWQmJihlPWMuZXZlbnQuc3BlY2lhbC5iZWZvcmV1bmxvYWQuYW1hem9uT3JpZ2luYWw9dGhpcy5vbmJlZm9yZXVubG9hZCk7dGhpcy5vbmJlZm9yZXVubG9hZD1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ZS5hcHBseSh0aGlzLGEpO2QuYXBwbHkodGhpcyxhKX19fSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9Yy5ldmVudC5zcGVjaWFsLmJlZm9yZXVubG9hZC5hbWF6b25PcmlnaW5hbH19fX07Yy5yZW1vdmVFdmVudD1tLnJlbW92ZUV2ZW50TGlzdGVuZXI/CmZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9O2MuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGMuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHwhMT09PWEucmV0dXJuVmFsdWV8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9YOkUpOnRoaXMudHlwZT1hO2ImJmMuZXh0ZW5kKHRoaXMsYik7dGhpcy50aW1lU3RhbXA9Yy5ub3coKTt0aGlzW2MuZXhwYW5kb109ITB9O2MuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPQpYO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9WDt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7YSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1YO3RoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpFLGlzUHJvcGFnYXRpb25TdG9wcGVkOkUsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6RX07dmFyIFNhPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVsYXRlZFRhcmdldCxkPSExLGU9YS50eXBlO2EudHlwZT1hLmRhdGE7YiE9PXRoaXMmJihiJiYoZD1jLmNvbnRhaW5zKHRoaXMsCmIpKSxkfHwoYy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1lKSl9LFRhPWZ1bmN0aW9uKGEpe2EudHlwZT1hLmRhdGE7Yy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2MuZXZlbnQuc3BlY2lhbFthXT17c2V0dXA6ZnVuY3Rpb24oZCl7Yy5ldmVudC5hZGQodGhpcyxiLGQmJmQuc2VsZWN0b3I/VGE6U2EsYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2MuZXZlbnQucmVtb3ZlKHRoaXMsYixhJiZhLnNlbGVjdG9yP1RhOlNhKX19fSk7Yy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChjLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbihhLGIpe2lmKGMubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2MuZXZlbnQuYWRkKHRoaXMsImNsaWNrLnNwZWNpYWxTdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPQphLnRhcmdldCxmPWMubm9kZU5hbWUoYiwiaW5wdXQiKXx8Yy5ub2RlTmFtZShiLCJidXR0b24iKT9iLnR5cGU6IiI7InN1Ym1pdCIhPT1mJiYiaW1hZ2UiIT09Znx8IWMoYikuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aHx8eGEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSk7Yy5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZj1jLm5vZGVOYW1lKGIsImlucHV0Iil8fGMubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi50eXBlOiIiOyJ0ZXh0IiE9PWYmJiJwYXNzd29yZCIhPT1mfHwhYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RofHwxMyE9PWEua2V5Q29kZXx8eGEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsU3VibWl0Iil9fSk7aWYoIWMuc3VwcG9ydC5jaGFuZ2VCdWJibGVzKXt2YXIgVyxVYT1mdW5jdGlvbihhKXt2YXIgYj0KYy5ub2RlTmFtZShhLCJpbnB1dCIpP2EudHlwZToiIixkPWEudmFsdWU7InJhZGlvIj09PWJ8fCJjaGVja2JveCI9PT1iP2Q9YS5jaGVja2VkOiJzZWxlY3QtbXVsdGlwbGUiPT09Yj9kPS0xPGEuc2VsZWN0ZWRJbmRleD9jLm1hcChhLm9wdGlvbnMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2VsZWN0ZWR9KS5qb2luKCItIik6IiI6Yy5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGQ9YS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gZH0sZmE9ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnRhcmdldCxlLGY7cmEudGVzdChkLm5vZGVOYW1lKSYmIWQucmVhZE9ubHkmJihlPWMuX2RhdGEoZCwiX2NoYW5nZV9kYXRhIiksZj1VYShkKSwiZm9jdXNvdXQiPT09YS50eXBlJiYicmFkaW8iPT09ZC50eXBlfHxjLl9kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsZiksdm9pZCAwPT09ZXx8Zj09PWV8fG51bGw9PWUmJiFmfHwoYS50eXBlPSJjaGFuZ2UiLGEubGl2ZUZpcmVkPXZvaWQgMCxjLmV2ZW50LnRyaWdnZXIoYSxiLApkKSkpfTtjLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDpmYSxiZWZvcmVkZWFjdGl2YXRlOmZhLGNsaWNrOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yy5ub2RlTmFtZShiLCJpbnB1dCIpP2IudHlwZToiIjsoInJhZGlvIj09PWR8fCJjaGVja2JveCI9PT1kfHxjLm5vZGVOYW1lKGIsInNlbGVjdCIpKSYmZmEuY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yy5ub2RlTmFtZShiLCJpbnB1dCIpP2IudHlwZToiIjsoMTM9PT1hLmtleUNvZGUmJiFjLm5vZGVOYW1lKGIsInRleHRhcmVhIil8fDMyPT09YS5rZXlDb2RlJiYoImNoZWNrYm94Ij09PWR8fCJyYWRpbyI9PT1kKXx8InNlbGVjdC1tdWx0aXBsZSI9PT1kKSYmZmEuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuX2RhdGEoYSwiX2NoYW5nZV9kYXRhIixVYShhKSl9fSxzZXR1cDpmdW5jdGlvbihhLGIpe2lmKCJmaWxlIj09PQp0aGlzLnR5cGUpcmV0dXJuITE7Zm9yKHZhciBkIGluIFcpYy5ldmVudC5hZGQodGhpcyxkKyIuc3BlY2lhbENoYW5nZSIsV1tkXSk7cmV0dXJuIHJhLnRlc3QodGhpcy5ub2RlTmFtZSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2MuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsQ2hhbmdlIik7cmV0dXJuIHJhLnRlc3QodGhpcy5ub2RlTmFtZSl9fTtXPWMuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVycztXLmZvY3VzPVcuYmVmb3JlYWN0aXZhdGV9Yy5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxjLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZChhKXt2YXIgZD1jLmV2ZW50LmZpeChhKTtkLnR5cGU9YjtkLm9yaWdpbmFsRXZlbnQ9e307Yy5ldmVudC50cmlnZ2VyKGQsbnVsbCxkLnRhcmdldCk7ZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYS5wcmV2ZW50RGVmYXVsdCgpfXZhciBlPTA7Yy5ldmVudC5zcGVjaWFsW2JdPQp7c2V0dXA6ZnVuY3Rpb24oKXswPT09ZSsrJiZtLmFkZEV2ZW50TGlzdGVuZXIoYSxkLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXswPT09LS1lJiZtLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLCEwKX19fSk7Yy5lYWNoKFsiYmluZCIsIm9uZSJdLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihhLGUsZil7dmFyIGc7aWYoIm9iamVjdCI9PT10eXBlb2YgYSl7Zm9yKHZhciBoIGluIGEpdGhpc1tiXShoLGUsYVtoXSxmKTtyZXR1cm4gdGhpc31pZigyPT09YXJndW1lbnRzLmxlbmd0aHx8ITE9PT1lKWY9ZSxlPXZvaWQgMDsib25lIj09PWI/KGc9ZnVuY3Rpb24oYSl7Yyh0aGlzKS51bmJpbmQoYSxnKTtyZXR1cm4gZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGcuZ3VpZD1mLmd1aWR8fGMuZ3VpZCsrKTpnPWY7aWYoInVubG9hZCI9PT1hJiYib25lIiE9PWIpdGhpcy5vbmUoYSxlLGYpO2Vsc2V7aD0wO2Zvcih2YXIgaz10aGlzLmxlbmd0aDtoPGs7aCsrKWMuZXZlbnQuYWRkKHRoaXNbaF0sCmEsZyxlKX1yZXR1cm4gdGhpc319KTtjLmZuLmV4dGVuZCh7dW5iaW5kOmZ1bmN0aW9uKGEsYil7aWYoIm9iamVjdCIhPT10eXBlb2YgYXx8YS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspYy5ldmVudC5yZW1vdmUodGhpc1tkXSxhLGIpO2Vsc2UgZm9yKGQgaW4gYSl0aGlzLnVuYmluZChkLGFbZF0pO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxlKXtyZXR1cm4gdGhpcy5saXZlKGIsYyxlLGEpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy51bmJpbmQoImxpdmUiKTp0aGlzLmRpZShiLG51bGwsYyxhKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gYy5ldmVudC50cmlnZ2VyKGEsCmIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsZD1hLmd1aWR8fGMuZ3VpZCsrLGU9MCxmPWZ1bmN0aW9uKGQpe3ZhciBmPShjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZTtjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGYrMSk7ZC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2ZdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2ZvcihmLmd1aWQ9ZDtlPGIubGVuZ3RoOyliW2UrK10uZ3VpZD1kO3JldHVybiB0aGlzLmNsaWNrKGYpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KTt2YXIgc2E9e2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCIsbW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2MuZWFjaChbImxpdmUiLCJkaWUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oYSxlLGYsZyl7dmFyIGg9CjAsayxsLG49Z3x8dGhpcy5zZWxlY3RvcixwPWc/dGhpczpjKHRoaXMuY29udGV4dCk7aWYoIm9iamVjdCI9PT10eXBlb2YgYSYmIWEucHJldmVudERlZmF1bHQpe2ZvcihrIGluIGEpcFtiXShrLGUsYVtrXSxuKTtyZXR1cm4gdGhpc31pZigiZGllIj09PWImJiFhJiZnJiYiLiI9PT1nLmNoYXJBdCgwKSlyZXR1cm4gcC51bmJpbmQoZyksdGhpcztpZighMT09PWV8fGMuaXNGdW5jdGlvbihlKSlmPWV8fEUsZT12b2lkIDA7Zm9yKGE9KGF8fCIiKS5zcGxpdCgiICIpO251bGwhPShnPWFbaCsrXSk7KWlmKGs9aWEuZXhlYyhnKSxsPSIiLGsmJihsPWtbMF0sZz1nLnJlcGxhY2UoaWEsIiIpKSwiaG92ZXIiPT09ZylhLnB1c2goIm1vdXNlZW50ZXIiK2wsIm1vdXNlbGVhdmUiK2wpO2Vsc2UgaWYoaz1nLHNhW2ddPyhhLnB1c2goc2FbZ10rbCksZys9bCk6Zz0oc2FbZ118fGcpK2wsImxpdmUiPT09Yil7bD0wO2Zvcih2YXIgbT1wLmxlbmd0aDtsPG07bCsrKWMuZXZlbnQuYWRkKHBbbF0sImxpdmUuIisKWihnLG4pLHtkYXRhOmUsc2VsZWN0b3I6bixoYW5kbGVyOmYsb3JpZ1R5cGU6ZyxvcmlnSGFuZGxlcjpmLHByZVR5cGU6a30pfWVsc2UgcC51bmJpbmQoImxpdmUuIitaKGcsbiksZik7cmV0dXJuIHRoaXN9fSk7Yy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihhLGMpe251bGw9PWMmJihjPWEsYT1udWxsKTtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMuYmluZChiLGEsYyk6dGhpcy50cmlnZ2VyKGIpfTtjLmF0dHJGbiYmKGMuYXR0ckZuW2JdPSEwKX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiLApjLGQsZSxmKXtlPTA7Zm9yKHZhciBnPWQubGVuZ3RoO2U8ZztlKyspe3ZhciBoPWRbZV07aWYoaCl7Zm9yKHZhciBrPSExLGg9aFthXTtoOyl7aWYoaC5zaXpjYWNoZT09PWMpe2s9ZFtoLnNpenNldF07YnJlYWt9MSE9PWgubm9kZVR5cGV8fGZ8fChoLnNpemNhY2hlPWMsaC5zaXpzZXQ9ZSk7aWYoaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yil7az1oO2JyZWFrfWg9aFthXX1kW2VdPWt9fX1mdW5jdGlvbiBiKGEsYixjLGQsZSxmKXtlPTA7Zm9yKHZhciBnPWQubGVuZ3RoO2U8ZztlKyspe3ZhciBoPWRbZV07aWYoaCl7Zm9yKHZhciBrPSExLGg9aFthXTtoOyl7aWYoaC5zaXpjYWNoZT09PWMpe2s9ZFtoLnNpenNldF07YnJlYWt9aWYoMT09PWgubm9kZVR5cGUpaWYoZnx8KGguc2l6Y2FjaGU9YyxoLnNpenNldD1lKSwic3RyaW5nIiE9PXR5cGVvZiBiKXtpZihoPT09Yil7az0hMDticmVha319ZWxzZSBpZigwPG4uZmlsdGVyKGIsW2hdKS5sZW5ndGgpe2s9aDticmVha31oPWhbYV19ZFtlXT0Ka319fXZhciBkPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZT0wLGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxnPSExLGg9ITAsaz0vXFwvZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2g9ITE7cmV0dXJuIDB9KTt2YXIgbj1mdW5jdGlvbihhLGIsYyxlKXtjPWN8fFtdO3ZhciBnPWI9Ynx8bTtpZigxIT09Yi5ub2RlVHlwZSYmOSE9PWIubm9kZVR5cGUpcmV0dXJuW107aWYoIWF8fCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIGM7dmFyIGgsayxsLHgsdCxPPSEwLHk9bi5pc1hNTChiKSx1PVtdLHo9YTtkbyBpZihkLmV4ZWMoIiIpLGg9ZC5leGVjKHopKWlmKHo9aFszXSx1LnB1c2goaFsxXSksaFsyXSl7eD1oWzNdO2JyZWFrfXdoaWxlKGgpO2lmKDE8dS5sZW5ndGgmJnEuZXhlYyhhKSlpZigyPT09CnUubGVuZ3RoJiZwLnJlbGF0aXZlW3VbMF1dKWs9QSh1WzBdK3VbMV0sYik7ZWxzZSBmb3Ioaz1wLnJlbGF0aXZlW3VbMF1dP1tiXTpuKHUuc2hpZnQoKSxiKTt1Lmxlbmd0aDspYT11LnNoaWZ0KCkscC5yZWxhdGl2ZVthXSYmKGErPXUuc2hpZnQoKSksaz1BKGEsayk7ZWxzZSBpZighZSYmMTx1Lmxlbmd0aCYmOT09PWIubm9kZVR5cGUmJiF5JiZwLm1hdGNoLklELnRlc3QodVswXSkmJiFwLm1hdGNoLklELnRlc3QodVt1Lmxlbmd0aC0xXSkmJihoPW4uZmluZCh1LnNoaWZ0KCksYix5KSxiPWguZXhwcj9uLmZpbHRlcihoLmV4cHIsaC5zZXQpWzBdOmguc2V0WzBdKSxiKWZvcihoPWU/e2V4cHI6dS5wb3AoKSxzZXQ6dyhlKX06bi5maW5kKHUucG9wKCksMSE9PXUubGVuZ3RofHwifiIhPT11WzBdJiYiKyIhPT11WzBdfHwhYi5wYXJlbnROb2RlP2I6Yi5wYXJlbnROb2RlLHkpLGs9aC5leHByP24uZmlsdGVyKGguZXhwcixoLnNldCk6aC5zZXQsMDx1Lmxlbmd0aD9sPXcoayk6Tz0hMTt1Lmxlbmd0aDspaD0KdD11LnBvcCgpLHAucmVsYXRpdmVbdF0/aD11LnBvcCgpOnQ9IiIsbnVsbD09aCYmKGg9YikscC5yZWxhdGl2ZVt0XShsLGgseSk7ZWxzZSBsPVtdO2x8fChsPWspO2x8fG4uZXJyb3IodHx8YSk7aWYoIltvYmplY3QgQXJyYXldIj09PWYuY2FsbChsKSlpZihPKWlmKGImJjE9PT1iLm5vZGVUeXBlKWZvcihhPTA7bnVsbCE9bFthXTthKyspbFthXSYmKCEwPT09bFthXXx8MT09PWxbYV0ubm9kZVR5cGUmJm4uY29udGFpbnMoYixsW2FdKSkmJmMucHVzaChrW2FdKTtlbHNlIGZvcihhPTA7bnVsbCE9bFthXTthKyspbFthXSYmMT09PWxbYV0ubm9kZVR5cGUmJmMucHVzaChrW2FdKTtlbHNlIGMucHVzaC5hcHBseShjLGwpO2Vsc2UgdyhsLGMpO3gmJihuKHgsZyxjLGUpLG4udW5pcXVlU29ydChjKSk7cmV0dXJuIGN9O24udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih5JiYoZz1oLGEuc29ydCh5KSxnKSlmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sCjEpO3JldHVybiBhfTtuLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbihhLG51bGwsbnVsbCxiKX07bi5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDxuKGIsbnVsbCxudWxsLFthXSkubGVuZ3RofTtuLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFhKXJldHVybltdO2Zvcih2YXIgZT0wLGY9cC5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7dmFyIGcsaD1wLm9yZGVyW2VdO2lmKGc9cC5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7dmFyIGw9Z1sxXTtnLnNwbGljZSgxLDEpO2lmKCJcXCIhPT1sLnN1YnN0cihsLmxlbmd0aC0xKSYmKGdbMV09KGdbMV18fCIiKS5yZXBsYWNlKGssIiIpLGQ9cC5maW5kW2hdKGcsYixjKSxudWxsIT1kKSl7YT1hLnJlcGxhY2UocC5tYXRjaFtoXSwiIik7YnJlYWt9fX1kfHwoZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLApleHByOmF9fTtuLmZpbHRlcj1mdW5jdGlvbihhLGIsYyxkKXtmb3IodmFyIGUsZixnPWEsaD1bXSxrPWIsbD1iJiZiWzBdJiZuLmlzWE1MKGJbMF0pO2EmJmIubGVuZ3RoOyl7Zm9yKHZhciBtIGluIHAuZmlsdGVyKWlmKG51bGwhPShlPXAubGVmdE1hdGNoW21dLmV4ZWMoYSkpJiZlWzJdKXt2YXIgcSx1LHg9cC5maWx0ZXJbbV07dT1lWzFdO2Y9ITE7ZS5zcGxpY2UoMSwxKTtpZigiXFwiIT09dS5zdWJzdHIodS5sZW5ndGgtMSkpe2s9PT1oJiYoaD1bXSk7aWYocC5wcmVGaWx0ZXJbbV0paWYoZT1wLnByZUZpbHRlclttXShlLGssYyxoLGQsbCksIWUpZj1xPSEwO2Vsc2UgaWYoITA9PT1lKWNvbnRpbnVlO2lmKGUpZm9yKHZhciB0PTA7bnVsbCE9KHU9a1t0XSk7dCsrKWlmKHUpe3E9eCh1LGUsdCxrKTt2YXIgdz1kXiEhcTtjJiZudWxsIT1xP3c/Zj0hMDprW3RdPSExOncmJihoLnB1c2godSksZj0hMCl9aWYodm9pZCAwIT09cSl7Y3x8KGs9aCk7YT1hLnJlcGxhY2UocC5tYXRjaFttXSwKIiIpO2lmKCFmKXJldHVybltdO2JyZWFrfX19aWYoYT09PWcpaWYobnVsbD09ZiluLmVycm9yKGEpO2Vsc2UgYnJlYWs7Zz1hfXJldHVybiBrfTtuLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYTt9O3ZhciBwPW4uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LywKUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPSJzdHJpbmciPT09dHlwZW9mIGIsZD1jJiYhbC50ZXN0KGIpLGM9YyYmIWQ7ZCYmKGI9Yi50b0xvd2VyQ2FzZSgpKTtmb3IodmFyIGQ9MCxlPWEubGVuZ3RoLGY7ZDxlO2QrKylpZihmPWFbZF0pe2Zvcig7KGY9Zi5wcmV2aW91c1NpYmxpbmcpJiYxIT09Zi5ub2RlVHlwZTspOwphW2RdPWN8fGYmJmYubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/Znx8ITE6Zj09PWJ9YyYmbi5maWx0ZXIoYixhLCEwKX0sIlx4M2UiOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0ic3RyaW5nIj09PXR5cGVvZiBiLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpZm9yKGI9Yi50b0xvd2VyQ2FzZSgpO2U8ZjtlKyspe2lmKGM9YVtlXSljPWMucGFyZW50Tm9kZSxhW2VdPWMubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/YzohMX1lbHNle2Zvcig7ZTxmO2UrKykoYz1hW2VdKSYmKGFbZV09ZD9jLnBhcmVudE5vZGU6Yy5wYXJlbnROb2RlPT09Yik7ZCYmbi5maWx0ZXIoYixhLCEwKX19LCIiOmZ1bmN0aW9uKGMsZCxmKXt2YXIgZyxoPWUrKyxrPWI7InN0cmluZyIhPT10eXBlb2YgZHx8bC50ZXN0KGQpfHwoZz1kPWQudG9Mb3dlckNhc2UoKSxrPWEpO2soInBhcmVudE5vZGUiLGQsaCxjLGcsZil9LCJ+IjpmdW5jdGlvbihjLGQsZil7dmFyIGcsaD1lKyssaz1iOyJzdHJpbmciIT09CnR5cGVvZiBkfHxsLnRlc3QoZCl8fChnPWQ9ZC50b0xvd2VyQ2FzZSgpLGs9YSk7aygicHJldmlvdXNTaWJsaW5nIixkLGgsYyxnLGYpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oYSxiLGMpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJiFjKXJldHVybihhPWIuZ2V0RWxlbWVudEJ5SWQoYVsxXSkpJiZhLnBhcmVudE5vZGU/W2FdOltdfSxOQU1FOmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSl7dmFyIGM9W107Yj1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKyliW2RdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGJbZF0pO3JldHVybiAwPT09Yy5sZW5ndGg/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSlyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LApwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXthPSIgIithWzFdLnJlcGxhY2UoaywiIikrIiAiO2lmKGYpcmV0dXJuIGE7Zj0wO2Zvcih2YXIgZztudWxsIT0oZz1iW2ZdKTtmKyspZyYmKGVeKGcuY2xhc3NOYW1lJiYwPD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywiICIpLmluZGV4T2YoYSkpP2N8fGQucHVzaChnKTpjJiYoYltmXT0hMSkpO3JldHVybiExfSxJRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGssIiIpfSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGssIiIpLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGEpe2lmKCJudGgiPT09YVsxXSl7YVsyXXx8bi5lcnJvcihhWzBdKTthWzJdPWFbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCIiKTt2YXIgYj0vKC0/KShcZCopKD86bihbK1wtXT9cZCopKT8vLmV4ZWMoImV2ZW4iPT09YVsyXSYmIjJuInx8Im9kZCI9PT1hWzJdJiYiMm4rMSJ8fAohL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTA7YVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZuLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtiPWFbMV09YVsxXS5yZXBsYWNlKGssIiIpOyFmJiZwLmF0dHJNYXBbYl0mJihhWzFdPXAuYXR0ck1hcFtiXSk7YVs0XT0oYVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoaywiIik7In5ceDNkIj09PWFbMl0mJihhWzRdPSIgIithWzRdKyIgIik7cmV0dXJuIGF9LFBTRVVETzpmdW5jdGlvbihhLGIsYyxlLGYpe2lmKCJub3QiPT09YVsxXSlpZigxPChkLmV4ZWMoYVszXSl8fCIiKS5sZW5ndGh8fC9eXHcvLnRlc3QoYVszXSkpYVszXT1uKGFbM10sbnVsbCxudWxsLGIpO2Vsc2UgcmV0dXJuIGE9bi5maWx0ZXIoYVszXSxiLGMsMV5mKSxjfHxlLnB1c2guYXBwbHkoZSxhKSwhMTtlbHNlIGlmKHAubWF0Y2guUE9TLnRlc3QoYVswXSl8fHAubWF0Y2guQ0hJTEQudGVzdChhWzBdKSlyZXR1cm4hMDsKcmV0dXJuIGF9LFBPUzpmdW5jdGlvbihhKXthLnVuc2hpZnQoITApO3JldHVybiBhfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4hMT09PWEuZGlzYWJsZWQmJiJoaWRkZW4iIT09YS50eXBlfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4hMD09PWEuZGlzYWJsZWR9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1hLmNoZWNrZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuITA9PT1hLnNlbGVjdGVkfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFuKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSwKYz1hLnR5cGU7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YyYmKGI9PT1jfHxudWxsPT09Yil9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJjaGVja2JveCI9PT1hLnR5cGV9LGZpbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Ynx8ImJ1dHRvbiI9PT1iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LAppbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ifHwiYnV0dG9uIj09PWIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoYS5ub2RlTmFtZSl9LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09YS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9fSxzZXRGaWx0ZXJzOntmaXJzdDpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yn0sbGFzdDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYj09PWQubGVuZ3RoLQoxfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDA9PT1iJTJ9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiAxPT09YiUyfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9cC5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoImNvbnRhaW5zIj09PWUpcmV0dXJuIDA8PShhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bi5nZXRUZXh0KFthXSl8fCIiKS5pbmRleE9mKGJbM10pO2lmKCJub3QiPT09ZSl7Yj1iWzNdO2M9MDtmb3IoZD1iLmxlbmd0aDtjPGQ7YysrKWlmKGJbY109PT1hKXJldHVybiExO3JldHVybiEwfW4uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsCmIpe3ZhciBjPWJbMV0sZD1hO3N3aXRjaChjKXtjYXNlICJvbmx5IjpjYXNlICJmaXJzdCI6Zm9yKDtkPWQucHJldmlvdXNTaWJsaW5nOylpZigxPT09ZC5ub2RlVHlwZSlyZXR1cm4hMTtpZigiZmlyc3QiPT09YylyZXR1cm4hMDtkPWE7Y2FzZSAibGFzdCI6Zm9yKDtkPWQubmV4dFNpYmxpbmc7KWlmKDE9PT1kLm5vZGVUeXBlKXJldHVybiExO3JldHVybiEwO2Nhc2UgIm50aCI6dmFyIGM9YlsyXSxlPWJbM107aWYoMT09PWMmJjA9PT1lKXJldHVybiEwO2I9YlswXTt2YXIgZj1hLnBhcmVudE5vZGU7aWYoZiYmKGYuc2l6Y2FjaGUhPT1ifHwhYS5ub2RlSW5kZXgpKXtmb3IodmFyIGc9MCxkPWYuZmlyc3RDaGlsZDtkO2Q9ZC5uZXh0U2libGluZykxPT09ZC5ub2RlVHlwZSYmKGQubm9kZUluZGV4PSsrZyk7Zi5zaXpjYWNoZT1ifWE9YS5ub2RlSW5kZXgtZTtyZXR1cm4gMD09PWM/MD09PWE6MD09PWElYyYmMDw9YS9jfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMT09PWEubm9kZVR5cGUmJgphLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiIqIj09PWImJjE9PT1hLm5vZGVUeXBlfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifSxDTEFTUzpmdW5jdGlvbihhLGIpe3JldHVybi0xPCgiICIrKGEuY2xhc3NOYW1lfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKGIpfSxBVFRSOmZ1bmN0aW9uKGEsYil7dmFyIGM9YlsxXTthPXAuYXR0ckhhbmRsZVtjXT9wLmF0dHJIYW5kbGVbY10oYSk6bnVsbCE9YVtjXT9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpO3ZhciBjPWErIiIsZD1iWzJdO2I9Yls0XTtyZXR1cm4gbnVsbD09YT8iIVx4M2QiPT09ZDoiXHgzZCI9PT1kP2M9PT1iOiIqXHgzZCI9PT1kPzA8PWMuaW5kZXhPZihiKToiflx4M2QiPT09ZD8wPD0oIiAiK2MrIiAiKS5pbmRleE9mKGIpOmI/IiFceDNkIj09PWQ/YyE9PWI6Il5ceDNkIj09PWQ/MD09PWMuaW5kZXhPZihiKToiJFx4M2QiPT09ZD9jLnN1YnN0cihjLmxlbmd0aC0KYi5sZW5ndGgpPT09YjoifFx4M2QiPT09ZD9jPT09Ynx8Yy5zdWJzdHIoMCxiLmxlbmd0aCsxKT09PWIrIi0iOiExOmMmJiExIT09YX0sUE9TOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXAuc2V0RmlsdGVyc1tiWzJdXTtpZihlKXJldHVybiBlKGEsYyxiLGQpfX19LHE9cC5tYXRjaC5QT1MseD1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX0sdDtmb3IodCBpbiBwLm1hdGNoKXAubWF0Y2hbdF09bmV3IFJlZ0V4cChwLm1hdGNoW3RdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpLHAubGVmdE1hdGNoW3RdPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStwLm1hdGNoW3RdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2cseCkpO3ZhciB3PWZ1bmN0aW9uKGEsYil7YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLDApO3JldHVybiBiPyhiLnB1c2guYXBwbHkoYixhKSxiKTphfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywKMClbMF0ubm9kZVR5cGV9Y2F0Y2godil7dz1mdW5jdGlvbihhLGIpe3ZhciBjPTA7Yj1ifHxbXTtpZigiW29iamVjdCBBcnJheV0iPT09Zi5jYWxsKGEpKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGIsYSk7ZWxzZSBpZigibnVtYmVyIj09PXR5cGVvZiBhLmxlbmd0aClmb3IodmFyIGQ9YS5sZW5ndGg7YzxkO2MrKyliLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWIucHVzaChhW2NdKTtyZXR1cm4gYn19dmFyIHksejttLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj95PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iPyhnPSEwLDApOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjE6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfTooeT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBnPSEwLDA7aWYoYS5zb3VyY2VJbmRleCYmCmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXTtjPWEucGFyZW50Tm9kZTtkPWIucGFyZW50Tm9kZTt2YXIgaD1jO2lmKGM9PT1kKXJldHVybiB6KGEsYik7aWYoIWMpcmV0dXJuLTE7aWYoIWQpcmV0dXJuIDE7Zm9yKDtoOyllLnVuc2hpZnQoaCksaD1oLnBhcmVudE5vZGU7Zm9yKGg9ZDtoOylmLnVuc2hpZnQoaCksaD1oLnBhcmVudE5vZGU7Yz1lLmxlbmd0aDtkPWYubGVuZ3RoO2ZvcihoPTA7aDxjJiZoPGQ7aCsrKWlmKGVbaF0hPT1mW2hdKXJldHVybiB6KGVbaF0sZltoXSk7cmV0dXJuIGg9PT1jP3ooYSxmW2hdLC0xKTp6KGVbaF0sYiwxKX0sej1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7Zm9yKGE9YS5uZXh0U2libGluZzthOyl7aWYoYT09PWIpcmV0dXJuLTE7YT1hLm5leHRTaWJsaW5nfXJldHVybiAxfSk7bi5nZXRUZXh0PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGQ9MDthW2RdO2QrKyljPQphW2RdLDM9PT1jLm5vZGVUeXBlfHw0PT09Yy5ub2RlVHlwZT9iKz1jLm5vZGVWYWx1ZTo4IT09Yy5ub2RlVHlwZSYmKGIrPW4uZ2V0VGV4dChjLmNoaWxkTm9kZXMpKTtyZXR1cm4gYn07KGZ1bmN0aW9uKCl7dmFyIGE9bS5jcmVhdGVFbGVtZW50KCJkaXYiKSxiPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpLGM9bS5kb2N1bWVudEVsZW1lbnQ7YS5pbm5lckhUTUw9Ilx4M2NhIG5hbWVceDNkJyIrYisiJy9ceDNlIjtjLmluc2VydEJlZm9yZShhLGMuZmlyc3RDaGlsZCk7bS5nZXRFbGVtZW50QnlJZChiKSYmKHAuZmluZC5JRD1mdW5jdGlvbihhLGIsYyl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmIWMpcmV0dXJuKGI9Yi5nZXRFbGVtZW50QnlJZChhWzFdKSk/Yi5pZD09PWFbMV18fCJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2V0QXR0cmlidXRlTm9kZSYmYi5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2JdOnZvaWQgMDoKW119LHAuZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9InVuZGVmaW5lZCIhPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIDE9PT1hLm5vZGVUeXBlJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KTtjLnJlbW92ZUNoaWxkKGEpO2M9YT1udWxsfSkoKTsoZnVuY3Rpb24oKXt2YXIgYT1tLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQobS5jcmVhdGVDb21tZW50KCIiKSk7MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoJiYocC5maW5kLlRBRz1mdW5jdGlvbihhLGIpe2I9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKTtpZigiKiI9PT1hWzFdKXthPVtdO2Zvcih2YXIgYz0wO2JbY107YysrKTE9PT1iW2NdLm5vZGVUeXBlJiZhLnB1c2goYltjXSk7Yj1hfXJldHVybiBifSk7YS5pbm5lckhUTUw9Ilx4M2NhIGhyZWZceDNkJyMnXHgzZVx4M2MvYVx4M2UiO2EuZmlyc3RDaGlsZCYmInVuZGVmaW5lZCIhPT0KdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUmJiIjIiE9PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSYmKHAuYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KTthPW51bGx9KSgpO20ucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1uLGI9bS5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD0iXHgzY3AgY2xhc3NceDNkJ1RFU1QnXHgzZVx4M2MvcFx4M2UiO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fDAhPT1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoKXtuPWZ1bmN0aW9uKGIsYyxkLGUpe2M9Y3x8bTtpZighZSYmIW4uaXNYTUwoYykpe3ZhciBmPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGYmJigxPT09Yy5ub2RlVHlwZXx8OT09PWMubm9kZVR5cGUpKXtpZihmWzFdKXJldHVybiB3KGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksCmQpO2lmKGZbMl0mJnAuZmluZC5DTEFTUyYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiB3KGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmWzJdKSxkKX1pZig5PT09Yy5ub2RlVHlwZSl7aWYoImJvZHkiPT09YiYmYy5ib2R5KXJldHVybiB3KFtjLmJvZHldLGQpO2lmKGYmJmZbM10pe3ZhciBnPWMuZ2V0RWxlbWVudEJ5SWQoZlszXSk7aWYoZyYmZy5wYXJlbnROb2RlKXtpZihnLmlkPT09ZlszXSlyZXR1cm4gdyhbZ10sZCl9ZWxzZSByZXR1cm4gdyhbXSxkKX10cnl7cmV0dXJuIHcoYy5xdWVyeVNlbGVjdG9yQWxsKGIpLGQpfWNhdGNoKGgpe319ZWxzZSBpZigxPT09Yy5ub2RlVHlwZSYmIm9iamVjdCIhPT1jLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBmPWMsaz0oZz1jLmdldEF0dHJpYnV0ZSgiaWQiKSl8fCJfX3NpenpsZV9fIixsPWMucGFyZW50Tm9kZSxyPS9eXHMqWyt+XS8udGVzdChiKTtnP2s9ay5yZXBsYWNlKC8nL2csIlxcJFx4MjYiKTpjLnNldEF0dHJpYnV0ZSgiaWQiLAprKTtyJiZsJiYoYz1jLnBhcmVudE5vZGUpO3RyeXtpZighcnx8bClyZXR1cm4gdyhjLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZFx4M2QnIitrKyInXSAiK2IpLGQpfWNhdGNoKGgpe31maW5hbGx5e2d8fGYucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixjLGQsZSl9O2Zvcih2YXIgYyBpbiBhKW5bY109YVtjXTtiPW51bGx9fSgpOyhmdW5jdGlvbigpe3ZhciBhPW0uZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgYz0hYi5jYWxsKG0uY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGQ9ITE7dHJ5e2IuY2FsbChtLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhXHgzZCcnXTpzaXp6bGUiKX1jYXRjaChlKXtkPSEwfW4ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsZSl7ZT1lLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csCiJceDNkJyQxJ10iKTtpZighbi5pc1hNTChhKSl0cnl7aWYoZHx8IXAubWF0Y2guUFNFVURPLnRlc3QoZSkmJiEvIT0vLnRlc3QoZSkpe3ZhciBmPWIuY2FsbChhLGUpO2lmKGZ8fCFjfHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGZ9fWNhdGNoKGcpe31yZXR1cm4gMDxuKGUsbnVsbCxudWxsLFthXSkubGVuZ3RofX19KSgpOyhmdW5jdGlvbigpe3ZhciBhPW0uY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9Ilx4M2NkaXYgY2xhc3NceDNkJ3Rlc3QgZSdceDNlXHgzYy9kaXZceDNlXHgzY2RpdiBjbGFzc1x4M2QndGVzdCdceDNlXHgzYy9kaXZceDNlIjthLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJjAhPT1hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGgmJihhLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiLDEhPT1hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGgmJihwLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksCnAuZmluZC5DTEFTUz1mdW5jdGlvbihhLGIsYyl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGwpKX0pKCk7bi5jb250YWlucz1tLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9mdW5jdGlvbihhLGIpe3JldHVybiBhIT09YiYmKGEuY29udGFpbnM/YS5jb250YWlucyhiKTohMCl9Om0uZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9OmZ1bmN0aW9uKCl7cmV0dXJuITF9O24uaXNYTUw9ZnVuY3Rpb24oYSl7cmV0dXJuKGE9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudCk/IkhUTUwiIT09YS5ub2RlTmFtZTohMX07dmFyIEE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9IiI7Zm9yKGI9Yi5ub2RlVHlwZT9bYl06CmI7Yz1wLm1hdGNoLlBTRVVETy5leGVjKGEpOyllKz1jWzBdLGE9YS5yZXBsYWNlKHAubWF0Y2guUFNFVURPLCIiKTthPXAucmVsYXRpdmVbYV0/YSsiKiI6YTtjPTA7Zm9yKHZhciBmPWIubGVuZ3RoO2M8ZjtjKyspbihhLGJbY10sZCk7cmV0dXJuIG4uZmlsdGVyKGUsZCl9O2MuZmluZD1uO2MuZXhwcj1uLnNlbGVjdG9ycztjLmV4cHJbIjoiXT1jLmV4cHIuZmlsdGVycztjLnVuaXF1ZT1uLnVuaXF1ZVNvcnQ7Yy50ZXh0PW4uZ2V0VGV4dDtjLmlzWE1MRG9jPW4uaXNYTUw7Yy5jb250YWlucz1uLmNvbnRhaW5zfSkoKTt2YXIgRWI9L1VudGlsJC8sRmI9L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sR2I9LywvLG5iPS9eLlteOiNcW1wuLF0qJC8sSGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLFZhPWMuZXhwci5tYXRjaC5QT1MsSWI9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07Yy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcywKZCxlO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIGMoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7ZD0wO2ZvcihlPWIubGVuZ3RoO2Q8ZTtkKyspaWYoYy5jb250YWlucyhiW2RdLHRoaXMpKXJldHVybiEwfSk7dmFyIGY9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxrO2Q9MDtmb3IoZT10aGlzLmxlbmd0aDtkPGU7ZCsrKWlmKGc9Zi5sZW5ndGgsYy5maW5kKGEsdGhpc1tkXSxmKSwwPGQpZm9yKGg9ZztoPGYubGVuZ3RoO2grKylmb3Ioaz0wO2s8ZztrKyspaWYoZltrXT09PWZbaF0pe2Yuc3BsaWNlKGgtLSwxKTticmVha31yZXR1cm4gZn0saGFzOmZ1bmN0aW9uKGEpe3ZhciBiPWMoYSk7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsZT1iLmxlbmd0aDthPGU7YSsrKWlmKGMuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHphKHRoaXMsYSwhMSksIm5vdCIsYSl9LApmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHphKHRoaXMsYSwhMCksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmKCJzdHJpbmciPT09dHlwZW9mIGE/MDxjLmZpbHRlcihhLHRoaXMpLmxlbmd0aDowPHRoaXMuZmlsdGVyKGEpLmxlbmd0aCl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD1bXSxlLGYsZz10aGlzWzBdO2lmKGMuaXNBcnJheShhKSl7dmFyIGgsaz17fSxsPTE7aWYoZyYmYS5sZW5ndGgpe2U9MDtmb3IoZj1hLmxlbmd0aDtlPGY7ZSsrKWg9YVtlXSxrW2hdfHwoa1toXT1WYS50ZXN0KGgpP2MoaCxifHx0aGlzLmNvbnRleHQpOmgpO2Zvcig7ZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yjspe2ZvcihoIGluIGspYT1rW2hdLChhLmpxdWVyeT8tMTxhLmluZGV4KGcpOmMoZykuaXMoYSkpJiZkLnB1c2goe3NlbGVjdG9yOmgsZWxlbTpnLGxldmVsOmx9KTtnPWcucGFyZW50Tm9kZTtsKyt9fXJldHVybiBkfWg9VmEudGVzdChhKXx8CiJzdHJpbmciIT09dHlwZW9mIGE/YyhhLGJ8fHRoaXMuY29udGV4dCk6MDtlPTA7Zm9yKGY9dGhpcy5sZW5ndGg7ZTxmO2UrKylmb3IoZz10aGlzW2VdO2c7KWlmKGg/LTE8aC5pbmRleChnKTpjLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2QucHVzaChnKTticmVha31lbHNlIGlmKGc9Zy5wYXJlbnROb2RlLCFnfHwhZy5vd25lckRvY3VtZW50fHxnPT09Ynx8MTE9PT1nLm5vZGVUeXBlKWJyZWFrO2Q9MTxkLmxlbmd0aD9jLnVuaXF1ZShkKTpkO3JldHVybiB0aGlzLnB1c2hTdGFjayhkLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PT10eXBlb2YgYT9jLmluQXJyYXkodGhpc1swXSxjKGEpKTpjLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe2E9InN0cmluZyI9PT10eXBlb2YgYT9jKGEsYik6Yy5tYWtlQXJyYXkoYSYmCmEubm9kZVR5cGU/W2FdOmEpO2I9Yy5tZXJnZSh0aGlzLmdldCgpLGEpO3JldHVybiB0aGlzLnB1c2hTdGFjayh5YShhWzBdKXx8eWEoYlswXSk/YjpjLnVuaXF1ZShiKSl9LGFuZFNlbGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5wcmV2T2JqZWN0KX19KTtjLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4oYT1hLnBhcmVudE5vZGUpJiYxMSE9PWEubm9kZVR5cGU/YTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsInBhcmVudE5vZGUiLGQpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGMubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZGlyKGEsCiJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciLGQpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGQpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gYy5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBjLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Yy5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Yy5mblthXT1mdW5jdGlvbihkLGUpe3ZhciBmPWMubWFwKHRoaXMsYixkKSxnPUhiLmNhbGwoYXJndW1lbnRzKTtFYi50ZXN0KGEpfHwoZT1kKTtlJiYic3RyaW5nIj09PXR5cGVvZiBlJiYKKGY9Yy5maWx0ZXIoZSxmKSk7Zj0xPHRoaXMubGVuZ3RoJiYhSWJbYV0/Yy51bmlxdWUoZik6ZjsoMTx0aGlzLmxlbmd0aHx8R2IudGVzdChlKSkmJkZiLnRlc3QoYSkmJihmPWYucmV2ZXJzZSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGcuam9pbigiLCIpKX19KTtjLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixkKXtkJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gMT09PWIubGVuZ3RoP2MuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Yy5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1bXTtmb3IoYT1hW2JdO2EmJjkhPT1hLm5vZGVUeXBlJiYodm9pZCAwPT09ZHx8MSE9PWEubm9kZVR5cGV8fCFjKGEpLmlzKGQpKTspMT09PWEubm9kZVR5cGUmJmUucHVzaChhKSxhPWFbYl07cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsYyxlKXtiPWJ8fDE7Zm9yKGU9MDthJiYoMSE9PWEubm9kZVR5cGV8fCsrZSE9PWIpO2E9CmFbY10pO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBKYj0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLHRhPS9eXHMrLyxXYT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFhhPS88KFtcdzpdKykvLEtiPS88dGJvZHkvaSxMYj0vPHwmIz9cdys7LyxZYT0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLFphPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLE1iPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2kscWI9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8seT17b3B0aW9uOlsxLCJceDNjc2VsZWN0IG11bHRpcGxlXHgzZCdtdWx0aXBsZSdceDNlIiwiXHgzYy9zZWxlY3RceDNlIl0sbGVnZW5kOlsxLAoiXHgzY2ZpZWxkc2V0XHgzZSIsIlx4M2MvZmllbGRzZXRceDNlIl0sdGhlYWQ6WzEsIlx4M2N0YWJsZVx4M2UiLCJceDNjL3RhYmxlXHgzZSJdLHRyOlsyLCJceDNjdGFibGVceDNlXHgzY3Rib2R5XHgzZSIsIlx4M2MvdGJvZHlceDNlXHgzYy90YWJsZVx4M2UiXSx0ZDpbMywiXHgzY3RhYmxlXHgzZVx4M2N0Ym9keVx4M2VceDNjdHJceDNlIiwiXHgzYy90clx4M2VceDNjL3Rib2R5XHgzZVx4M2MvdGFibGVceDNlIl0sY29sOlsyLCJceDNjdGFibGVceDNlXHgzY3Rib2R5XHgzZVx4M2MvdGJvZHlceDNlXHgzY2NvbGdyb3VwXHgzZSIsIlx4M2MvY29sZ3JvdXBceDNlXHgzYy90YWJsZVx4M2UiXSxhcmVhOlsxLCJceDNjbWFwXHgzZSIsIlx4M2MvbWFwXHgzZSJdLF9kZWZhdWx0OlswLCIiLCIiXX07eS5vcHRncm91cD15Lm9wdGlvbjt5LnRib2R5PXkudGZvb3Q9eS5jb2xncm91cD15LmNhcHRpb249eS50aGVhZDt5LnRoPXkudGQ7Yy5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fCh5Ll9kZWZhdWx0PQpbMSwiZGl2XHgzY2Rpdlx4M2UiLCJceDNjL2Rpdlx4M2UiXSk7Yy5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKTtkLnRleHQoYS5jYWxsKHRoaXMsYixkLnRleHQoKSkpfSk6Im9iamVjdCIhPT10eXBlb2YgYSYmdm9pZCAwIT09YT90aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fG0pLmNyZWF0ZVRleHROb2RlKGEpKTpjLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Yyh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWMoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pO2IubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzO2EuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZTspYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gYy5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1jKHRoaXMpLGQ9Yi5jb250ZW50cygpO2QubGVuZ3RoP2Qud3JhcEFsbChhKTpiLmFwcGVuZChhKX0pfSx3cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjKHRoaXMpLndyYXBBbGwoYSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Mubm9kZU5hbWUodGhpcywiYm9keSIpfHxjKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLAohMCxmdW5jdGlvbihhKXsxPT09dGhpcy5ub2RlVHlwZSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpezE9PT10aGlzLm5vZGVUeXBlJiZ0aGlzLmluc2VydEJlZm9yZShhLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT1jKGFyZ3VtZW50c1swXSk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsCiExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGMoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTAsZTtudWxsIT0oZT10aGlzW2RdKTtkKyspaWYoIWF8fGMuZmlsdGVyKGEsW2VdKS5sZW5ndGgpYnx8MSE9PWUubm9kZVR5cGV8fChjLmNsZWFuRGF0YShlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGMuY2xlYW5EYXRhKFtlXSkpLGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7bnVsbCE9KGI9dGhpc1thXSk7YSsrKWZvcigxPT09Yi5ub2RlVHlwZSYmYy5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1udWxsPT1hPyExOmE7Yj1udWxsPT1iP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYy5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hKXJldHVybiB0aGlzWzBdJiYxPT09dGhpc1swXS5ub2RlVHlwZT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKEpiLCIiKTpudWxsO2lmKCJzdHJpbmciIT09dHlwZW9mIGF8fFlhLnRlc3QoYSl8fCFjLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJnRhLnRlc3QoYSl8fHlbKFhhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKWMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKTtkLmh0bWwoYS5jYWxsKHRoaXMsYixkLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtlbHNle2E9YS5yZXBsYWNlKFdhLCJceDNjJDFceDNlXHgzYy8kMlx4M2UiKTt0cnl7Zm9yKHZhciBiPQowLGQ9dGhpcy5sZW5ndGg7YjxkO2IrKykxPT09dGhpc1tiXS5ub2RlVHlwZSYmKGMuY2xlYW5EYXRhKHRoaXNbYl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tiXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9Yyh0aGlzKSxlPWQuaHRtbCgpO2QucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixlKSl9KTsic3RyaW5nIiE9PXR5cGVvZiBhJiYoYT1jKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxkPXRoaXMucGFyZW50Tm9kZTtjKHRoaXMpLnJlbW92ZSgpO2I/YyhiKS5iZWZvcmUoYSk6YyhkKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/CnRoaXMucHVzaFN0YWNrKGMoYy5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGcsaD1hWzBdLGs9W107aWYoIWMuc3VwcG9ydC5jaGVja0Nsb25lJiYzPT09YXJndW1lbnRzLmxlbmd0aCYmInN0cmluZyI9PT10eXBlb2YgaCYmWmEudGVzdChoKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5kb21NYW5pcChhLGIsZCwhMCl9KTtpZihjLmlzRnVuY3Rpb24oaCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1jKHRoaXMpO2FbMF09aC5jYWxsKHRoaXMsZSxiP2YuaHRtbCgpOnZvaWQgMCk7Zi5kb21NYW5pcChhLGIsZCl9KTtpZih0aGlzWzBdKXtlPWgmJmgucGFyZW50Tm9kZTtlPWMuc3VwcG9ydC5wYXJlbnROb2RlJiZlJiYxMT09PWUubm9kZVR5cGUmJmUuY2hpbGROb2Rlcy5sZW5ndGg9PT0KdGhpcy5sZW5ndGg/e2ZyYWdtZW50OmV9OmMuYnVpbGRGcmFnbWVudChhLHRoaXMsayk7Zz1lLmZyYWdtZW50O2lmKGY9MT09PWcuY2hpbGROb2Rlcy5sZW5ndGg/Zz1nLmZpcnN0Q2hpbGQ6Zy5maXJzdENoaWxkKXtiPWImJmMubm9kZU5hbWUoZiwidHIiKTtmb3IodmFyIGw9MCxuPXRoaXMubGVuZ3RoLG09bi0xO2w8bjtsKyspZC5jYWxsKGI/b2IodGhpc1tsXSxmKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHwxPG4mJmw8bT9jLmNsb25lKGcsITAsITApOmcpfWsubGVuZ3RoJiZjLmVhY2goayxwYil9cmV0dXJuIHRoaXN9fSk7Yy5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGcsaDtiJiZiWzBdJiYoaD1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pO2guY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGg9bSk7MT09PWEubGVuZ3RoJiYic3RyaW5nIj09PXR5cGVvZiBhWzBdJiY1MTI+YVswXS5sZW5ndGgmJmg9PT1tJiYiXHgzYyI9PT1hWzBdLmNoYXJBdCgwKSYmIVlhLnRlc3QoYVswXSkmJgooYy5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFaYS50ZXN0KGFbMF0pKSYmKGY9ITAsKGc9Yy5mcmFnbWVudHNbYVswXV0pJiYxIT09ZyYmKGU9ZykpO2V8fChlPWguY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGMuY2xlYW4oYSxoLGUsZCkpO2YmJihjLmZyYWdtZW50c1thWzBdXT1nP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmZ9fTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCl7dmFyIGU9W107ZD1jKGQpO3ZhciBmPTE9PT10aGlzLmxlbmd0aCYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGYmJjExPT09Zi5ub2RlVHlwZSYmMT09PWYuY2hpbGROb2Rlcy5sZW5ndGgmJjE9PT1kLmxlbmd0aClyZXR1cm4gZFtiXSh0aGlzWzBdKSx0aGlzOwpmb3IodmFyIGY9MCxnPWQubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPSgwPGY/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCk7YyhkW2ZdKVtiXShoKTtlPWUuY29uY2F0KGgpfXJldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsZC5zZWxlY3Rvcil9fSk7Yy5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1hLmNsb25lTm9kZSghMCksZixnLGg7aWYoIShjLnN1cHBvcnQubm9DbG9uZUV2ZW50JiZjLnN1cHBvcnQubm9DbG9uZUNoZWNrZWR8fDEhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGV8fGMuaXNYTUxEb2MoYSkpKWZvcihCYShhLGUpLGY9YWEoYSksZz1hYShlKSxoPTA7ZltoXTsrK2gpZ1toXSYmQmEoZltoXSxnW2hdKTtpZihiJiYoQWEoYSxlKSxkKSlmb3IoZj1hYShhKSxnPWFhKGUpLGg9MDtmW2hdOysraClBYShmW2hdLGdbaF0pO3JldHVybiBlfSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXtiPWJ8fG07InVuZGVmaW5lZCI9PT10eXBlb2YgYi5jcmVhdGVFbGVtZW50JiYKKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fG0pO2Zvcih2YXIgZj1bXSxnLGg9MCxrO251bGwhPShrPWFbaF0pO2grKylpZigibnVtYmVyIj09PXR5cGVvZiBrJiYoays9IiIpLGspe2lmKCJzdHJpbmciPT09dHlwZW9mIGspaWYoTGIudGVzdChrKSl7az1rLnJlcGxhY2UoV2EsIlx4M2MkMVx4M2VceDNjLyQyXHgzZSIpO2c9KFhhLmV4ZWMoayl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCk7dmFyIGw9eVtnXXx8eS5fZGVmYXVsdCxuPWxbMF0scD1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ZvcihwLmlubmVySFRNTD1sWzFdK2srbFsyXTtuLS07KXA9cC5sYXN0Q2hpbGQ7aWYoIWMuc3VwcG9ydC50Ym9keSlmb3Iobj1LYi50ZXN0KGspLGw9InRhYmxlIiE9PWd8fG4/Ilx4M2N0YWJsZVx4M2UiIT09bFsxXXx8bj9bXTpwLmNoaWxkTm9kZXM6cC5maXJzdENoaWxkJiZwLmZpcnN0Q2hpbGQuY2hpbGROb2RlcyxnPWwubGVuZ3RoLTE7MDw9ZzstLWcpYy5ub2RlTmFtZShsW2ddLAoidGJvZHkiKSYmIWxbZ10uY2hpbGROb2Rlcy5sZW5ndGgmJmxbZ10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsW2ddKTshYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZ0YS50ZXN0KGspJiZwLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKHRhLmV4ZWMoaylbMF0pLHAuZmlyc3RDaGlsZCk7az1wLmNoaWxkTm9kZXN9ZWxzZSBrPWIuY3JlYXRlVGV4dE5vZGUoayk7dmFyIHE7aWYoIWMuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWlmKGtbMF0mJiJudW1iZXIiPT09dHlwZW9mKHE9ay5sZW5ndGgpKWZvcihnPTA7ZzxxO2crKylEYShrW2ddKTtlbHNlIERhKGspO2subm9kZVR5cGU/Zi5wdXNoKGspOmY9Yy5tZXJnZShmLGspfWlmKGQpZm9yKGE9ZnVuY3Rpb24oYSl7cmV0dXJuIWEudHlwZXx8TWIudGVzdChhLnR5cGUpfSxoPTA7ZltoXTtoKyspIWV8fCFjLm5vZGVOYW1lKGZbaF0sInNjcmlwdCIpfHxmW2hdLnR5cGUmJiJ0ZXh0L2phdmFzY3JpcHQiIT09ZltoXS50eXBlLnRvTG93ZXJDYXNlKCk/CigxPT09ZltoXS5ub2RlVHlwZSYmKGI9Yy5ncmVwKGZbaF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGEpLGYuc3BsaWNlLmFwcGx5KGYsW2grMSwwXS5jb25jYXQoYikpKSxkLmFwcGVuZENoaWxkKGZbaF0pKTplLnB1c2goZltoXS5wYXJlbnROb2RlP2ZbaF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmW2hdKTpmW2hdKTtyZXR1cm4gZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixkLGU9Yy5jYWNoZSxmPWMuZXhwYW5kbyxnPWMuZXZlbnQuc3BlY2lhbCxoPWMuc3VwcG9ydC5kZWxldGVFeHBhbmRvLGs9MCxsO251bGwhPShsPWFba10pO2srKylpZighbC5ub2RlTmFtZXx8IWMubm9EYXRhW2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0paWYoZD1sW2MuZXhwYW5kb10pe2lmKChiPWVbZF0mJmVbZF1bZl0pJiZiLmV2ZW50cyl7Zm9yKHZhciBuIGluIGIuZXZlbnRzKWdbbl0/Yy5ldmVudC5yZW1vdmUobCxuKTpjLnJlbW92ZUV2ZW50KGwsbixiLmhhbmRsZSk7CmIuaGFuZGxlJiYoYi5oYW5kbGUuZWxlbT1udWxsKX1oP2RlbGV0ZSBsW2MuZXhwYW5kb106bC5yZW1vdmVBdHRyaWJ1dGUmJmwucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZGVsZXRlIGVbZF19fX0pO3ZhciB1YT0vYWxwaGFcKFteKV0qXCkvaSxOYj0vb3BhY2l0eT0oW14pXSopLyxPYj0vKFtBLVpdfF5tcykvZywkYT0vXi0/XGQrKD86cHgpPyQvaSxQYj0vXi0/XGQvLFFiPS9eKFtcLStdKT0oW1wtKy5cZGVdKykvLFJiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxyYj1bIkxlZnQiLCJSaWdodCJdLHNiPVsiVG9wIiwiQm90dG9tIl0sRixhYixiYjtjLmZuLmNzcz1mdW5jdGlvbihhLGIpe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwPT09Yj90aGlzOmMuYWNjZXNzKHRoaXMsYSxiLCEwLGZ1bmN0aW9uKGEsYixmKXtyZXR1cm4gdm9pZCAwIT09Zj9jLnN0eWxlKGEsYixmKTpjLmNzcyhhLGIpfSl9OwpjLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBiPyhhPUYoYSwib3BhY2l0eSIsIm9wYWNpdHkiKSwiIj09PWE/IjEiOmEpOmEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e2ZpbGxPcGFjaXR5OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjpjLnN1cHBvcnQuY3NzRmxvYXQ/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixkLGUpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGYsZz1jLmNhbWVsQ2FzZShiKSxoPWEuc3R5bGUsaz1jLmNzc0hvb2tzW2ddO2I9Yy5jc3NQcm9wc1tnXXx8ZztpZih2b2lkIDAhPT1kKXtpZihlPXR5cGVvZiBkLCJzdHJpbmciPT09ZSYmKGY9UWIuZXhlYyhkKSkmJihkPSsoZlsxXSsxKSorZlsyXSsKcGFyc2VGbG9hdChjLmNzcyhhLGIpKSxlPSJudW1iZXIiKSwhKG51bGw9PWR8fCJudW1iZXIiPT09ZSYmaXNOYU4oZCl8fCgibnVtYmVyIiE9PWV8fGMuY3NzTnVtYmVyW2ddfHwoZCs9InB4IiksayYmInNldCJpbiBrJiZ2b2lkIDA9PT0oZD1rLnNldChhLGQpKSkpKXRyeXtoW2JdPWR9Y2F0Y2gobCl7fX1lbHNlIHJldHVybiBrJiYiZ2V0ImluIGsmJnZvaWQgMCE9PShmPWsuZ2V0KGEsITEsZSkpP2Y6aFtiXX19LGNzczpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZjtiPWMuY2FtZWxDYXNlKGIpO2Y9Yy5jc3NIb29rc1tiXTtiPWMuY3NzUHJvcHNbYl18fGI7ImNzc0Zsb2F0Ij09PWImJihiPSJmbG9hdCIpO2lmKGYmJiJnZXQiaW4gZiYmdm9pZCAwIT09KGU9Zi5nZXQoYSwhMCxkKSkpcmV0dXJuIGU7aWYoRilyZXR1cm4gRihhLGIpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT17fSxmO2ZvcihmIGluIGIpZVtmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtjLmNhbGwoYSk7CmZvcihmIGluIGIpYS5zdHlsZVtmXT1lW2ZdfX0pO2MuY3VyQ1NTPWMuY3NzO2MuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtjLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxlLGYpe3ZhciBnO2lmKGUpe2lmKDAhPT1hLm9mZnNldFdpZHRoKXJldHVybiBFYShhLGIsZik7Yy5zd2FwKGEsUmIsZnVuY3Rpb24oKXtnPUVhKGEsYixmKX0pO3JldHVybiBnfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoJGEudGVzdChiKSl7aWYoYj1wYXJzZUZsb2F0KGIpLDA8PWIpcmV0dXJuIGIrInB4In1lbHNlIHJldHVybiBifX19KTtjLnN1cHBvcnQub3BhY2l0eXx8KGMuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIE5iLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD0KYS5zdHlsZTthPWEuY3VycmVudFN0eWxlO3ZhciBlPWMuaXNOYU4oYik/IiI6ImFscGhhKG9wYWNpdHlceDNkIisxMDAqYisiKSIsZj1hJiZhLmZpbHRlcnx8ZC5maWx0ZXJ8fCIiO2Quem9vbT0xO2lmKDE8PWImJiIiPT09Yy50cmltKGYucmVwbGFjZSh1YSwiIikpJiYoZC5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLGEmJiFhLmZpbHRlcikpcmV0dXJuO2QuZmlsdGVyPXVhLnRlc3QoZik/Zi5yZXBsYWNlKHVhLGUpOmYrIiAiK2V9fSk7YyhmdW5jdGlvbigpe2Muc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoYy5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGQ7Yy5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7ZD1iP0YoYSwibWFyZ2luLXJpZ2h0IiwibWFyZ2luUmlnaHQiKTphLnN0eWxlLm1hcmdpblJpZ2h0fSk7cmV0dXJuIGR9fSl9KTttLmRlZmF1bHRWaWV3JiZtLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJgooYWI9ZnVuY3Rpb24oYSxiKXt2YXIgZCxlO2I9Yi5yZXBsYWNlKE9iLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKGU9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KXtpZihlPWUuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKWQ9ZS5nZXRQcm9wZXJ0eVZhbHVlKGIpLCIiIT09ZHx8Yy5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpfHwoZD1jLnN0eWxlKGEsYikpO3JldHVybiBkfX0pO20uZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJiPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGU9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlW2JdLGY9YS5zdHlsZTshJGEudGVzdChjKSYmUGIudGVzdChjKSYmKGI9Zi5sZWZ0LGUmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGM9Zi5waXhlbExlZnQrInB4IixmLmxlZnQ9YixlJiYoYS5ydW50aW1lU3R5bGUubGVmdD0KZSkpO3JldHVybiIiPT09Yz8iYXV0byI6Y30pO0Y9YWJ8fGJiO2MuZXhwciYmYy5leHByLmZpbHRlcnMmJihjLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIDA9PT1hLm9mZnNldFdpZHRoJiYwPT09Ynx8IWMuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJiJub25lIj09PShhLnN0eWxlLmRpc3BsYXl8fGMuY3NzKGEsImRpc3BsYXkiKSl9LGMuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWMuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBTYj0vJTIwL2csdGI9L1xbXF0kLyxjYj0vXHI/XG4vZyxUYj0vIy4qJC8sVWI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxWYj0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksCldiPS9eKD86R0VUfEhFQUQpJC8sWGI9L15cL1wvLyxkYj0vXD8vLFliPS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLFpiPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pLEdhPS9ccysvLCRiPS8oWz8mXSlfPVteJl0qLyxlYj0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspKT8pPy8sZmI9Yy5mbi5sb2FkLGphPXt9LGdiPXt9LE4sSjt0cnl7Tj12Yi5ocmVmfWNhdGNoKGEpe049bS5jcmVhdGVFbGVtZW50KCJhIiksTi5ocmVmPSIiLE49Ti5ocmVmfUo9ZWIuZXhlYyhOLnRvTG93ZXJDYXNlKCkpfHxbXTtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYoInN0cmluZyIhPT10eXBlb2YgYSYmZmIpcmV0dXJuIGZiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGU9YS5pbmRleE9mKCIgIik7aWYoMDw9ZSl7dmFyIGY9YS5zbGljZShlLGEubGVuZ3RoKTsKYT1hLnNsaWNlKDAsZSl9ZT0iR0VUIjtiJiYoYy5pc0Z1bmN0aW9uKGIpPyhkPWIsYj12b2lkIDApOiJvYmplY3QiPT09dHlwZW9mIGImJihiPWMucGFyYW0oYixjLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksZT0iUE9TVCIpKTt2YXIgZz10aGlzO2MuYWpheCh7dXJsOmEsdHlwZTplLGRhdGFUeXBlOiJodG1sIixkYXRhOmIsY29tcGxldGU6ZnVuY3Rpb24oYSxiLGUpe2U9YS5yZXNwb25zZVRleHQ7YS5pc1Jlc29sdmVkKCkmJihhLmRvbmUoZnVuY3Rpb24oYSl7ZT1hfSksZy5odG1sKGY/YygiXHgzY2Rpdlx4M2UiKS5hcHBlbmQoZS5yZXBsYWNlKFliLCIiKSkuZmluZChmKTplKSk7ZCYmZy5lYWNoKGQsW2UsYixhXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/CmMubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8WmIudGVzdCh0aGlzLm5vZGVOYW1lKXx8VmIudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe2E9Yyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09YT9udWxsOmMuaXNBcnJheShhKT9jLm1hcChhLGZ1bmN0aW9uKGEsYyl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShjYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoY2IsIlxyXG4iKX19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iaW5kKGIsYSl9fSk7Yy5lYWNoKFsiZ2V0IiwicG9zdCJdLApmdW5jdGlvbihhLGIpe2NbYl09ZnVuY3Rpb24oYSxlLGYsZyl7Yy5pc0Z1bmN0aW9uKGUpJiYoZz1nfHxmLGY9ZSxlPXZvaWQgMCk7cmV0dXJuIGMuYWpheCh7dHlwZTpiLHVybDphLGRhdGE6ZSxzdWNjZXNzOmYsZGF0YVR5cGU6Z30pfX0pO2MuZXh0ZW5kKHtnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSx2b2lkIDAsYiwic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmdldChhLGIsZCwianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP0hhKGEsYy5hamF4U2V0dGluZ3MpOihiPWEsYT1jLmFqYXhTZXR0aW5ncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgSy5ndWFyZEN1cnJlbnQmJihiLnN1Y2Nlc3MmJihiLnN1Y2Nlc3M9Sy5ndWFyZEN1cnJlbnQoYi5zdWNjZXNzKSksYi5lcnJvciYmKGIuZXJyb3I9Sy5ndWFyZEN1cnJlbnQoYi5lcnJvcikpKTtIYShhLGIpO3JldHVybiBhfSxhamF4U2V0dGluZ3M6e3VybDpOLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KEpbMV0pLApnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6IiovKiJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpxLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpjLnBhcnNlSlNPTiwidGV4dCB4bWwiOmMucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6RmEoamEpLGFqYXhUcmFuc3BvcnQ6RmEoZ2IpLGFqYXg6ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gZChhLGIsZCxtKXtpZigyIT09eil7ej0yO3kmJmNsZWFyVGltZW91dCh5KTt3PXZvaWQgMDt4PW18fCIiO3IucmVhZHlTdGF0ZT0wPGE/NDowO3ZhciBwLHEsdDttPWI7aWYoZCl7dmFyIHY9ZSxZPXIsdT12LmNvbnRlbnRzLEg9di5kYXRhVHlwZXMsRD12LnJlc3BvbnNlRmllbGRzLEMsQixQLEs7Zm9yKEIgaW4gRClCIGluIGQmJihZW0RbQl1dPWRbQl0pO2Zvcig7IioiPT09SFswXTspSC5zaGlmdCgpLHZvaWQgMD09PUMmJihDPXYubWltZVR5cGV8fFkuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihDKWZvcihCIGluIHUpaWYodVtCXSYmdVtCXS50ZXN0KEMpKXtILnVuc2hpZnQoQik7YnJlYWt9aWYoSFswXWluIGQpUD1IWzBdO2Vsc2V7Zm9yKEIgaW4gZCl7aWYoIUhbMF18fHYuY29udmVydGVyc1tCKyIgIitIWzBdXSl7UD1CO2JyZWFrfUt8fChLPUIpfVA9UHx8S31QPyhQIT09SFswXSYmSC51bnNoaWZ0KFApLGQ9ZFtQXSk6ZD12b2lkIDB9ZWxzZSBkPQp2b2lkIDA7aWYoMjAwPD1hJiYzMDA+YXx8MzA0PT09YSl7aWYoZS5pZk1vZGlmaWVkKXtpZihDPXIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSljLmxhc3RNb2RpZmllZFtuXT1DO2lmKEM9ci5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpKWMuZXRhZ1tuXT1DfWlmKDMwND09PWEpbT0ibm90bW9kaWZpZWQiLHA9ITA7ZWxzZSB0cnl7Qz1lO0MuZGF0YUZpbHRlciYmKGQ9Qy5kYXRhRmlsdGVyKGQsQy5kYXRhVHlwZSkpO3ZhciBMPUMuZGF0YVR5cGVzO0I9e307dmFyIEUsSSxOPUwubGVuZ3RoLEosUT1MWzBdLEYsTSxSLFQsRztmb3IoRT0xO0U8TjtFKyspe2lmKDE9PT1FKWZvcihJIGluIEMuY29udmVydGVycykic3RyaW5nIj09PXR5cGVvZiBJJiYoQltJLnRvTG93ZXJDYXNlKCldPUMuY29udmVydGVyc1tJXSk7Rj1RO1E9TFtFXTtpZigiKiI9PT1RKVE9RjtlbHNlIGlmKCIqIiE9PUYmJkYhPT1RKXtNPUYrIiAiK1E7Uj1CW01dfHxCWyIqICIrUV07aWYoIVIpZm9yKFQgaW4gRz0Kdm9pZCAwLEIpaWYoSj1ULnNwbGl0KCIgIiksSlswXT09PUZ8fCIqIj09PUpbMF0paWYoRz1CW0pbMV0rIiAiK1FdKXtUPUJbVF07ITA9PT1UP1I9RzohMD09PUcmJihSPVQpO2JyZWFrfVJ8fEd8fGMuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK00ucmVwbGFjZSgiICIsIiB0byAiKSk7ITAhPT1SJiYoZD1SP1IoZCk6RyhUKGQpKSl9fXE9ZDttPSJzdWNjZXNzIjtwPSEwfWNhdGNoKFMpe209InBhcnNlcmVycm9yIix0PVN9fWVsc2UgaWYodD1tLCFtfHxhKW09ImVycm9yIiwwPmEmJihhPTApO3Iuc3RhdHVzPWE7ci5zdGF0dXNUZXh0PSIiKyhifHxtKTtwP2gucmVzb2x2ZVdpdGgoZixbcSxtLHJdKTpoLnJlamVjdFdpdGgoZixbcixtLHRdKTtyLnN0YXR1c0NvZGUobCk7bD12b2lkIDA7QSYmZy50cmlnZ2VyKCJhamF4IisocD8iU3VjY2VzcyI6IkVycm9yIiksW3IsZSxwP3E6dF0pO2sucmVzb2x2ZVdpdGgoZixbcixtXSk7QSYmKGcudHJpZ2dlcigiYWpheENvbXBsZXRlIixbciwKZV0pLC0tYy5hY3RpdmV8fGMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fSJvYmplY3QiPT09dHlwZW9mIGEmJihiPWEsYT12b2lkIDApO2I9Ynx8e307dmFyIGU9Yy5hamF4U2V0dXAoe30sYiksZj1lLmNvbnRleHR8fGUsZz1mIT09ZSYmKGYubm9kZVR5cGV8fGYgaW5zdGFuY2VvZiBjKT9jKGYpOmMuZXZlbnQsaD1jLkRlZmVycmVkKCksaz1jLl9EZWZlcnJlZCgpLGw9ZS5zdGF0dXNDb2RlfHx7fSxuLG09e30scT17fSx4LHQsdyx5LHo9MCxBLHYscj17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXtpZigheil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO2E9cVtjXT1xW2NdfHxhO21bYV09Yn1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT16P3g6bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMj09PXope2lmKCF0KWZvcih0PXt9O2I9VWIuZXhlYyh4KTspdFtiWzFdLnRvTG93ZXJDYXNlKCldPQpiWzJdO2I9dFthLnRvTG93ZXJDYXNlKCldfXJldHVybiB2b2lkIDA9PT1iP251bGw6Yn0sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXt6fHwoZS5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiO3cmJncuYWJvcnQoYSk7ZCgwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHIpO3Iuc3VjY2Vzcz1yLmRvbmU7ci5lcnJvcj1yLmZhaWw7ci5jb21wbGV0ZT1rLmRvbmU7ci5zdGF0dXNDb2RlPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiO2lmKDI+eilmb3IoYiBpbiBhKWxbYl09W2xbYl0sYVtiXV07ZWxzZSBiPWFbci5zdGF0dXNdLHIudGhlbihiLGIpfXJldHVybiB0aGlzfTtlLnVybD0oKGF8fGUudXJsKSsiIikucmVwbGFjZShUYiwiIikucmVwbGFjZShYYixKWzFdKyIvLyIpO2UuZGF0YVR5cGVzPWMudHJpbShlLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoR2EpO251bGw9PWUuY3Jvc3NEb21haW4mJihhPWViLmV4ZWMoZS51cmwudG9Mb3dlckNhc2UoKSksCmUuY3Jvc3NEb21haW49ISghYXx8YVsxXT09SlsxXSYmYVsyXT09SlsyXSYmKGFbM118fCgiaHR0cDoiPT09YVsxXT84MDo0NDMpKT09KEpbM118fCgiaHR0cDoiPT09SlsxXT84MDo0NDMpKSkpO2UuZGF0YSYmZS5wcm9jZXNzRGF0YSYmInN0cmluZyIhPT10eXBlb2YgZS5kYXRhJiYoZS5kYXRhPWMucGFyYW0oZS5kYXRhLGUudHJhZGl0aW9uYWwpKTtiYShqYSxlLGIscik7aWYoMj09PXopcmV0dXJuITE7QT1lLmdsb2JhbDtlLnR5cGU9ZS50eXBlLnRvVXBwZXJDYXNlKCk7ZS5oYXNDb250ZW50PSFXYi50ZXN0KGUudHlwZSk7QSYmMD09PWMuYWN0aXZlKysmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWUuaGFzQ29udGVudCYmKGUuZGF0YSYmKGUudXJsKz0oZGIudGVzdChlLnVybCk/Ilx4MjYiOiI/IikrZS5kYXRhLGRlbGV0ZSBlLmRhdGEpLG49ZS51cmwsITE9PT1lLmNhY2hlKSl7YT1jLm5vdygpO3ZhciBEPWUudXJsLnJlcGxhY2UoJGIsIiQxX1x4M2QiK2EpOwplLnVybD1EKyhEPT09ZS51cmw/KGRiLnRlc3QoZS51cmwpPyJceDI2IjoiPyIpKyJfXHgzZCIrYToiIil9KGUuZGF0YSYmZS5oYXNDb250ZW50JiYhMSE9PWUuY29udGVudFR5cGV8fGIuY29udGVudFR5cGUpJiZyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZS5jb250ZW50VHlwZSk7ZS5pZk1vZGlmaWVkJiYobj1ufHxlLnVybCxjLmxhc3RNb2RpZmllZFtuXSYmci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsYy5sYXN0TW9kaWZpZWRbbl0pLGMuZXRhZ1tuXSYmci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixjLmV0YWdbbl0pKTtyLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZS5kYXRhVHlwZXNbMF0mJmUuYWNjZXB0c1tlLmRhdGFUeXBlc1swXV0/ZS5hY2NlcHRzW2UuZGF0YVR5cGVzWzBdXSsoIioiIT09ZS5kYXRhVHlwZXNbMF0/IiwgKi8qOyBxXHgzZDAuMDEiOiIiKTplLmFjY2VwdHNbIioiXSk7Zm9yKHYgaW4gZS5oZWFkZXJzKXIuc2V0UmVxdWVzdEhlYWRlcih2LAplLmhlYWRlcnNbdl0pO2lmKGUuYmVmb3JlU2VuZCYmKCExPT09ZS5iZWZvcmVTZW5kLmNhbGwoZixyLGUpfHwyPT09eikpcmV0dXJuIHIuYWJvcnQoKSwhMTtmb3IodiBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSlyW3ZdKGVbdl0pO2lmKHc9YmEoZ2IsZSxiLHIpKXtyLnJlYWR5U3RhdGU9MTtBJiZnLnRyaWdnZXIoImFqYXhTZW5kIixbcixlXSk7ZS5hc3luYyYmMDxlLnRpbWVvdXQmJih5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmFib3J0KCJ0aW1lb3V0Iil9LGUudGltZW91dCkpO3RyeXt6PTEsdy5zZW5kKG0sZCl9Y2F0Y2goZGEpezI+ej9kKC0xLGRhKTpjLmVycm9yKGRhKX19ZWxzZSBkKC0xLCJObyBUcmFuc3BvcnQiKTtyZXR1cm4gcn0scGFyYW06ZnVuY3Rpb24oYSxiKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1jLmlzRnVuY3Rpb24oYik/YigpOmI7ZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyJceDNkIitlbmNvZGVVUklDb21wb25lbnQoYil9Owp2b2lkIDA9PT1iJiYoYj1jLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoYy5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWMuaXNQbGFpbk9iamVjdChhKSljLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGYgaW4gYSlrYShmLGFbZl0sYixlKTtyZXR1cm4gZC5qb2luKCJceDI2IikucmVwbGFjZShTYiwiKyIpfX0pO2MuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBhYz1jLm5vdygpLGdhPS8oXD0pXD8oJnwkKXxcP1w/L2k7Yy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBjLmV4cGFuZG8rIl8iK2FjKyt9fSk7Yy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihhLGIsZCl7Yj0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09PWEuY29udGVudFR5cGUmJiJzdHJpbmciPT09dHlwZW9mIGEuZGF0YTsKaWYoImpzb25wIj09PWEuZGF0YVR5cGVzWzBdfHwhMSE9PWEuanNvbnAmJihnYS50ZXN0KGEudXJsKXx8YiYmZ2EudGVzdChhLmRhdGEpKSl7dmFyIGUsZj1hLmpzb25wQ2FsbGJhY2s9Yy5pc0Z1bmN0aW9uKGEuanNvbnBDYWxsYmFjayk/YS5qc29ucENhbGxiYWNrKCk6YS5qc29ucENhbGxiYWNrLGc9cVtmXSxoPWEudXJsLGs9YS5kYXRhLGw9IiQxIitmKyIkMiI7ITEhPT1hLmpzb25wJiYoaD1oLnJlcGxhY2UoZ2EsbCksYS51cmw9PT1oJiYoYiYmKGs9ay5yZXBsYWNlKGdhLGwpKSxhLmRhdGE9PT1rJiYoaCs9KC9cPy8udGVzdChoKT8iXHgyNiI6Ij8iKSthLmpzb25wKyJceDNkIitmKSkpO2EudXJsPWg7YS5kYXRhPWs7cVtmXT1mdW5jdGlvbihhKXtlPVthXX07ZC5hbHdheXMoZnVuY3Rpb24oKXtxW2ZdPWc7aWYoZSYmYy5pc0Z1bmN0aW9uKGcpKXFbZl0oZVswXSl9KTthLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtlfHxjLmVycm9yKGYrIiB3YXMgbm90IGNhbGxlZCIpOwpyZXR1cm4gZVswXX07YS5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pO2MuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtjLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pO2MuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXt2b2lkIDA9PT1hLmNhY2hlJiYoYS5jYWNoZT0hMSk7YS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KTtjLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGIsYz1tLmhlYWR8fG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Cm0uZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7Yj1tLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2IuYXN5bmM9ImFzeW5jIjthLnNjcmlwdENoYXJzZXQmJihiLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KTtiLnNyYz1hLnVybDtiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGUpe2lmKGV8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSliLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGMmJmIucGFyZW50Tm9kZSYmYy5yZW1vdmVDaGlsZChiKSxiPXZvaWQgMCxlfHxmKDIwMCwic3VjY2VzcyIpfTtjLmluc2VydEJlZm9yZShiLGMuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7aWYoYiliLm9ubG9hZCgwLDEpfX19fSk7dmFyIHZhPXEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBTKVNbYV0oMCwxKX06ITEsYmM9MCxTO2MuYWpheFNldHRpbmdzLnhocj0KcS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7dmFyIGE7aWYoIShhPSF0aGlzLmlzTG9jYWwmJklhKCkpKWE6e3RyeXthPW5ldyBxLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7YnJlYWsgYX1jYXRjaChiKXt9YT12b2lkIDB9cmV0dXJuIGF9OklhOyhmdW5jdGlvbihhKXtjLmV4dGVuZChjLnN1cHBvcnQse2FqYXg6ISFhLGNvcnM6ISFhJiYid2l0aENyZWRlbnRpYWxzImluIGF9KX0pKGMuYWpheFNldHRpbmdzLnhocigpKTtjLnN1cHBvcnQuYWpheCYmYy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxjLnN1cHBvcnQuY29ycyl7dmFyIGI7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXt2YXIgZj1hLnhocigpLGcsaDthLnVzZXJuYW1lP2Yub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpOmYub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyk7aWYoYS54aHJGaWVsZHMpZm9yKGggaW4gYS54aHJGaWVsZHMpZltoXT0KYS54aHJGaWVsZHNbaF07YS5taW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUoYS5taW1lVHlwZSk7YS5jcm9zc0RvbWFpbnx8ZFsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZFsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IoaCBpbiBkKWYuc2V0UmVxdWVzdEhlYWRlcihoLGRbaF0pfWNhdGNoKGspe31mLnNlbmQoYS5oYXNDb250ZW50JiZhLmRhdGF8fG51bGwpO2I9ZnVuY3Rpb24oZCxoKXt2YXIgbixtLHEseCx0O3RyeXtpZihiJiYoaHx8ND09PWYucmVhZHlTdGF0ZSkpaWYoYj12b2lkIDAsZyYmKGYub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcCx2YSYmZGVsZXRlIFNbZ10pLGgpNCE9PWYucmVhZHlTdGF0ZSYmZi5hYm9ydCgpO2Vsc2V7bj1mLnN0YXR1cztxPWYuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7eD17fTsodD1mLnJlc3BvbnNlWE1MKSYmdC5kb2N1bWVudEVsZW1lbnQmJih4LnhtbD10KTt4LnRleHQ9CmYucmVzcG9uc2VUZXh0O3RyeXttPWYuc3RhdHVzVGV4dH1jYXRjaCh3KXttPSIifW58fCFhLmlzTG9jYWx8fGEuY3Jvc3NEb21haW4/MTIyMz09PW4mJihuPTIwNCk6bj14LnRleHQ/MjAwOjQwNH19Y2F0Y2godyl7aHx8ZSgtMSx3KX14JiZlKG4sbSx4LHEpfTthLmFzeW5jJiY0IT09Zi5yZWFkeVN0YXRlPyhnPSsrYmMsdmEmJihTfHwoUz17fSxjKHEpLnVubG9hZCh2YSkpLFNbZ109YiksZi5vbnJlYWR5c3RhdGVjaGFuZ2U9Yik6YigpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIoMCwxKX19fX0pO3ZhciBsYT17fSxBLEcsY2M9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGRjPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksaGEsS2E9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSwKWyJvcGFjaXR5Il1dLGNhO2MuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKGEsYixkKXtpZihhfHwwPT09YSlyZXR1cm4gdGhpcy5hbmltYXRlKE0oInNob3ciLDMpLGEsYixkKTtkPTA7Zm9yKHZhciBlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspYT10aGlzW2RdLGEuc3R5bGUmJihiPWEuc3R5bGUuZGlzcGxheSxjLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8Im5vbmUiIT09Ynx8KGI9YS5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PWImJiJub25lIj09PWMuY3NzKGEsImRpc3BsYXkiKSYmYy5fZGF0YShhLCJvbGRkaXNwbGF5IixMYShhLm5vZGVOYW1lKSkpO2ZvcihkPTA7ZDxlO2QrKylpZihhPXRoaXNbZF0sYS5zdHlsZSYmKGI9YS5zdHlsZS5kaXNwbGF5LCIiPT09Ynx8Im5vbmUiPT09YikpYS5zdHlsZS5kaXNwbGF5PWMuX2RhdGEoYSwib2xkZGlzcGxheSIpfHwiIjtyZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsZCl7aWYoYXx8MD09PWEpcmV0dXJuIHRoaXMuYW5pbWF0ZShNKCJoaWRlIiwKMyksYSxiLGQpO2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUmJihkPWMuY3NzKHRoaXNbYV0sImRpc3BsYXkiKSwibm9uZSI9PT1kfHxjLl9kYXRhKHRoaXNbYV0sIm9sZGRpc3BsYXkiKXx8Yy5fZGF0YSh0aGlzW2FdLCJvbGRkaXNwbGF5IixkKSk7Zm9yKGE9MDthPGI7YSsrKXRoaXNbYV0uc3R5bGUmJih0aGlzW2FdLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtyZXR1cm4gdGhpc30sX3RvZ2dsZTpjLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPSJib29sZWFuIj09PXR5cGVvZiBhO2MuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bnVsbD09YXx8ZT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1lP2E6Yyh0aGlzKS5pcygiOmhpZGRlbiIpO2ModGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKE0oInRvZ2dsZSIsMyksYSxiLGQpO3JldHVybiB0aGlzfSwKZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGUpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGUpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPWMuc3BlZWQoYixkLGUpO2lmKGMuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGYuY29tcGxldGUsWyExXSk7YT1jLmV4dGVuZCh7fSxhKTtyZXR1cm4gdGhpc1shMT09PWYucXVldWU/ImVhY2giOiJxdWV1ZSJdKGZ1bmN0aW9uKCl7ITE9PT1mLnF1ZXVlJiZjLl9tYXJrKHRoaXMpO3ZhciBiPWMuZXh0ZW5kKHt9LGYpLGQ9MT09PXRoaXMubm9kZVR5cGUsZT1kJiZjKHRoaXMpLmlzKCI6aGlkZGVuIiksbCxuLG0scSx4O2IuYW5pbWF0ZWRQcm9wZXJ0aWVzPXt9O2ZvcihtIGluIGEpe2w9Yy5jYW1lbENhc2UobSk7bSE9PWwmJihhW2xdPWFbbV0sZGVsZXRlIGFbbV0pO249YVtsXTtjLmlzQXJyYXkobik/KGIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2xdPQpuWzFdLG49YVtsXT1uWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tsXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tsXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoImhpZGUiPT09biYmZXx8InNob3ciPT09biYmIWUpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTshZHx8ImhlaWdodCIhPT1sJiYid2lkdGgiIT09bHx8KGIub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldLCJpbmxpbmUiPT09Yy5jc3ModGhpcywiZGlzcGxheSIpJiYibm9uZSI9PT1jLmNzcyh0aGlzLCJmbG9hdCIpJiYoYy5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ/KG49TGEodGhpcy5ub2RlTmFtZSksImlubGluZSI9PT1uP3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjoodGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHRoaXMuc3R5bGUuem9vbT0xKSk6dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSl9bnVsbCE9CmIub3ZlcmZsb3cmJih0aGlzLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKTtmb3IobSBpbiBhKWlmKGQ9bmV3IGMuZngodGhpcyxiLG0pLG49YVttXSxjYy50ZXN0KG4pKWRbInRvZ2dsZSI9PT1uP2U/InNob3ciOiJoaWRlIjpuXSgpO2Vsc2UgbD1kYy5leGVjKG4pLHE9ZC5jdXIoKSxsPyhuPXBhcnNlRmxvYXQobFsyXSkseD1sWzNdfHwoYy5jc3NOdW1iZXJbbV0/IiI6InB4IiksInB4IiE9PXgmJihjLnN0eWxlKHRoaXMsbSwobnx8MSkreCkscSo9KG58fDEpL2QuY3VyKCksYy5zdHlsZSh0aGlzLG0scSt4KSksbFsxXSYmKG49KCItXHgzZCI9PT1sWzFdPy0xOjEpKm4rcSksZC5jdXN0b20ocSxuLHgpKTpkLmN1c3RvbShxLG4sIiIpO3JldHVybiEwfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXthJiZ0aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYT1jLnRpbWVycyxlPWEubGVuZ3RoO2ZvcihifHxjLl91bm1hcmsoITAsdGhpcyk7ZS0tOylpZihhW2VdLmVsZW09PT0KdGhpcyl7aWYoYilhW2VdKCEwKTthLnNwbGljZShlLDEpfX0pO2J8fHRoaXMuZGVxdWV1ZSgpO3JldHVybiB0aGlzfX0pO2MuZWFjaCh7c2xpZGVEb3duOk0oInNob3ciLDEpLHNsaWRlVXA6TSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6TSgidG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7Yy5mblthXT1mdW5jdGlvbihhLGMsZil7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEmJiJvYmplY3QiPT09dHlwZW9mIGE/Yy5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmR8fCFkJiZifHxjLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6ZCYmYnx8YiYmIWMuaXNGdW5jdGlvbihiKSYmYn07ZS5kdXJhdGlvbj1jLmZ4Lm9mZj8wOiJudW1iZXIiPT09dHlwZW9mIGUuZHVyYXRpb24/CmUuZHVyYXRpb246ZS5kdXJhdGlvbiBpbiBjLmZ4LnNwZWVkcz9jLmZ4LnNwZWVkc1tlLmR1cmF0aW9uXTpjLmZ4LnNwZWVkcy5fZGVmYXVsdDtlLm9sZD1lLmNvbXBsZXRlO2UuY29tcGxldGU9ZnVuY3Rpb24oYSl7Yy5pc0Z1bmN0aW9uKGUub2xkKSYmZS5vbGQuY2FsbCh0aGlzKTshMSE9PWUucXVldWU/Yy5kZXF1ZXVlKHRoaXMpOiExIT09YSYmYy5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZX0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZSl7cmV0dXJuIGMrZSphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxlKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZStjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yjt0aGlzLmVsZW09YTt0aGlzLnByb3A9YztiLm9yaWc9Yi5vcmlnfHx7fX19KTtjLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLAp0aGlzLm5vdyx0aGlzKTsoYy5meC5zdGVwW3RoaXMucHJvcF18fGMuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuZWxlbVt0aGlzLnByb3BdJiYoIXRoaXMuZWxlbS5zdHlsZXx8bnVsbD09dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF0pKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWMuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpP2ImJiJhdXRvIiE9PWI/YjowOmF9LGN1c3RvbTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZShhKXtyZXR1cm4gZi5zdGVwKGEpfXZhciBmPXRoaXMsZz1jLmZ4O3RoaXMuc3RhcnRUaW1lPWNhfHxKYSgpO3RoaXMuc3RhcnQ9YTt0aGlzLmVuZD1iO3RoaXMudW5pdD1kfHx0aGlzLnVuaXR8fChjLmNzc051bWJlclt0aGlzLnByb3BdPyIiOiJweCIpO3RoaXMubm93PXRoaXMuc3RhcnQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0wO2UuZWxlbT0KdGhpcy5lbGVtO2UoKSYmYy50aW1lcnMucHVzaChlKSYmIWhhJiYoaGE9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Yy5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMuc2hvdz0hMDt0aGlzLmN1c3RvbSgid2lkdGgiPT09dGhpcy5wcm9wfHwiaGVpZ2h0Ij09PXRoaXMucHJvcD8xOjAsdGhpcy5jdXIoKSk7Yyh0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Yy5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMuaGlkZT0hMDt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPWNhfHxKYSgpLGQ9ITAsZT10aGlzLmVsZW0sZj10aGlzLm9wdGlvbnMsZztpZihhfHxiPj1mLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZDsKdGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7Zi5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXT0hMDtmb3IoZyBpbiBmLmFuaW1hdGVkUHJvcGVydGllcykhMCE9PWYuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddJiYoZD0hMSk7aWYoZCl7bnVsbD09Zi5vdmVyZmxvd3x8Yy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3N8fGMuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtlLnN0eWxlWyJvdmVyZmxvdyIrYl09Zi5vdmVyZmxvd1thXX0pO2YuaGlkZSYmYyhlKS5oaWRlKCk7aWYoZi5oaWRlfHxmLnNob3cpZm9yKHZhciBoIGluIGYuYW5pbWF0ZWRQcm9wZXJ0aWVzKWMuc3R5bGUoZSxoLGYub3JpZ1toXSk7Zi5jb21wbGV0ZS5jYWxsKGUpfXJldHVybiExfUluZmluaXR5PT1mLmR1cmF0aW9uP3RoaXMubm93PWI6KGE9Yi10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWEvZi5kdXJhdGlvbix0aGlzLnBvcz1jLmVhc2luZ1tmLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLAphLDAsMSxmLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyk7dGhpcy51cGRhdGUoKTtyZXR1cm4hMH19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9Yy50aW1lcnMsYj0wO2I8YS5sZW5ndGg7KytiKWFbYl0oKXx8YS5zcGxpY2UoYi0tLDEpO2EubGVuZ3RofHxjLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoaGEpO2hhPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Muc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtLnN0eWxlW2EucHJvcF09KCJ3aWR0aCI9PT1hLnByb3B8fCJoZWlnaHQiPT09YS5wcm9wP01hdGgubWF4KDAsYS5ub3cpOgphLm5vdykrYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KTtjLmV4cHImJmMuZXhwci5maWx0ZXJzJiYoYy5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZ3JlcChjLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBlYz0vXnQoPzphYmxlfGR8aCkkL2ksaGI9L14oPzpib2R5fGh0bWwpJC9pO2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gbS5kb2N1bWVudEVsZW1lbnQ/ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxkO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtkPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZyl7fXZhciBlPQpiLm93bmVyRG9jdW1lbnQsZj1lLmRvY3VtZW50RWxlbWVudDtpZighZHx8IWMuY29udGFpbnMoZixiKSlyZXR1cm4gZD97dG9wOmQudG9wLGxlZnQ6ZC5sZWZ0fTp7dG9wOjAsbGVmdDowfTtiPWUuYm9keTtlPW1hKGUpO3JldHVybnt0b3A6ZC50b3ArKGUucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmZi5zY3JvbGxUb3B8fGIuc2Nyb2xsVG9wKS0oZi5jbGllbnRUb3B8fGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoZS5wYWdlWE9mZnNldHx8Yy5zdXBwb3J0LmJveE1vZGVsJiZmLnNjcm9sbExlZnR8fGIuc2Nyb2xsTGVmdCktKGYuY2xpZW50TGVmdHx8Yi5jbGllbnRMZWZ0fHwwKX19OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7CmMub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZCxlPWIub2Zmc2V0UGFyZW50LGY9Yi5vd25lckRvY3VtZW50LGc9Zi5kb2N1bWVudEVsZW1lbnQsaD1mLmJvZHk7ZD0oZj1mLmRlZmF1bHRWaWV3KT9mLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZTtmb3IodmFyIGs9Yi5vZmZzZXRUb3AsbD1iLm9mZnNldExlZnQ7KGI9Yi5wYXJlbnROb2RlKSYmYiE9PWgmJmIhPT1nJiYoIWMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbnx8ImZpeGVkIiE9PWQucG9zaXRpb24pOylkPWY/Zi5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGUsay09Yi5zY3JvbGxUb3AsbC09Yi5zY3JvbGxMZWZ0LGI9PT1lJiYoays9Yi5vZmZzZXRUb3AsbCs9Yi5vZmZzZXRMZWZ0LCFjLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyfHxjLm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscyYmZWMudGVzdChiLm5vZGVOYW1lKXx8KGsrPXBhcnNlRmxvYXQoZC5ib3JkZXJUb3BXaWR0aCl8fAowLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxlPWIub2Zmc2V0UGFyZW50KSxjLm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUmJiJ2aXNpYmxlIiE9PWQub3ZlcmZsb3cmJihrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKTtpZigicmVsYXRpdmUiPT09ZC5wb3NpdGlvbnx8InN0YXRpYyI9PT1kLnBvc2l0aW9uKWsrPWgub2Zmc2V0VG9wLGwrPWgub2Zmc2V0TGVmdDtjLm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJiJmaXhlZCI9PT1kLnBvc2l0aW9uJiYoays9TWF0aC5tYXgoZy5zY3JvbGxUb3AsaC5zY3JvbGxUb3ApLGwrPU1hdGgubWF4KGcuc2Nyb2xsTGVmdCxoLnNjcm9sbExlZnQpKTtyZXR1cm57dG9wOmssbGVmdDpsfX07Yy5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT1tLmJvZHksYj1tLmNyZWF0ZUVsZW1lbnQoImRpdiIpLApkLGUsZixnPXBhcnNlRmxvYXQoYy5jc3MoYSwibWFyZ2luVG9wIikpfHwwO2MuZXh0ZW5kKGIuc3R5bGUse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLGJvcmRlcjowLHdpZHRoOiIxcHgiLGhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSk7Yi5pbm5lckhUTUw9Ilx4M2NkaXYgc3R5bGVceDNkJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OydceDNlXHgzY2Rpdlx4M2VceDNjL2Rpdlx4M2VceDNjL2Rpdlx4M2VceDNjdGFibGUgc3R5bGVceDNkJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmdceDNkJzAnIGNlbGxzcGFjaW5nXHgzZCcwJ1x4M2VceDNjdHJceDNlXHgzY3RkXHgzZVx4M2MvdGRceDNlXHgzYy90clx4M2VceDNjL3RhYmxlXHgzZSI7CmEuaW5zZXJ0QmVmb3JlKGIsYS5maXJzdENoaWxkKTtkPWIuZmlyc3RDaGlsZDtlPWQuZmlyc3RDaGlsZDtmPWQubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkO3RoaXMuZG9lc05vdEFkZEJvcmRlcj01IT09ZS5vZmZzZXRUb3A7dGhpcy5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscz01PT09Zi5vZmZzZXRUb3A7ZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2Uuc3R5bGUudG9wPSIyMHB4Ijt0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbj0yMD09PWUub2Zmc2V0VG9wfHwxNT09PWUub2Zmc2V0VG9wO2Uuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiI7ZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9LTU9PT1lLm9mZnNldFRvcDt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09ZzthLnJlbW92ZUNoaWxkKGIpOwpjLm9mZnNldC5pbml0aWFsaXplPWMubm9vcH0sYm9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxkPWEub2Zmc2V0TGVmdDtjLm9mZnNldC5pbml0aWFsaXplKCk7Yy5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxkKz1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmR9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWMuY3NzKGEsInBvc2l0aW9uIik7InN0YXRpYyI9PT1lJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZj1jKGEpLGc9Zi5vZmZzZXQoKSxoPWMuY3NzKGEsInRvcCIpLGs9Yy5jc3MoYSwibGVmdCIpLGw9e307KCJhYnNvbHV0ZSI9PT1lfHwiZml4ZWQiPT09ZSkmJi0xPGMuaW5BcnJheSgiYXV0byIsW2gsa10pPyhrPWYucG9zaXRpb24oKSxlPWsudG9wLGs9ay5sZWZ0KToKKGU9cGFyc2VGbG9hdChoKXx8MCxrPXBhcnNlRmxvYXQoayl8fDApO2MuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsZCxnKSk7bnVsbCE9Yi50b3AmJihsLnRvcD1iLnRvcC1nLnRvcCtlKTtudWxsIT1iLmxlZnQmJihsLmxlZnQ9Yi5sZWZ0LWcubGVmdCtrKTsidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxsKTpmLmNzcyhsKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxlPWhiLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7ZC5sZWZ0LT1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDA7ZS50b3ArPXBhcnNlRmxvYXQoYy5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDA7ZS5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3NzKGJbMF0sCiJib3JkZXJMZWZ0V2lkdGgiKSl8fDA7cmV0dXJue3RvcDpkLnRvcC1lLnRvcCxsZWZ0OmQubGVmdC1lLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fG0uYm9keTthJiYhaGIudGVzdChhLm5vZGVOYW1lKSYmInN0YXRpYyI9PT1jLmNzcyhhLCJwb3NpdGlvbiIpOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSk7Yy5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9InNjcm9sbCIrYjtjLmZuW2RdPWZ1bmN0aW9uKGIpe3ZhciBmLGc7cmV0dXJuIHZvaWQgMD09PWI/KGY9dGhpc1swXSxmPyhnPW1hKGYpKT8icGFnZVhPZmZzZXQiaW4gZz9nW2E/InBhZ2VZT2Zmc2V0IjoicGFnZVhPZmZzZXQiXTpjLnN1cHBvcnQuYm94TW9kZWwmJmcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2RdfHxnLmRvY3VtZW50LmJvZHlbZF06ZltkXTpudWxsKTp0aGlzLmVhY2goZnVuY3Rpb24oKXsoZz0KbWEodGhpcykpP2cuc2Nyb2xsVG8oYT9jKGcpLnNjcm9sbExlZnQoKTpiLGE/YjpjKGcpLnNjcm9sbFRvcCgpKTp0aGlzW2RdPWJ9KX19KTtjLmVhY2goWyJIZWlnaHQiLCJXaWR0aCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9Yi50b0xvd2VyQ2FzZSgpO2MuZm5bImlubmVyIitiXT1mdW5jdGlvbigpe3ZhciBhPXRoaXNbMF07cmV0dXJuIGEmJmEuc3R5bGU/cGFyc2VGbG9hdChjLmNzcyhhLGQsInBhZGRpbmciKSk6bnVsbH07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07cmV0dXJuIGImJmIuc3R5bGU/cGFyc2VGbG9hdChjLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOm51bGx9O2MuZm5bZF09ZnVuY3Rpb24oYSl7dmFyIGY9dGhpc1swXTtpZighZilyZXR1cm4gbnVsbD09YT9udWxsOnRoaXM7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGY9Yyh0aGlzKTtmW2RdKGEuY2FsbCh0aGlzLGIsZltkXSgpKSl9KTsKaWYoYy5pc1dpbmRvdyhmKSl7dmFyIGc9Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl0sZj1mLmRvY3VtZW50LmJvZHk7cmV0dXJuIGMuc3VwcG9ydC5ib3hNb2RlbCYmZ3x8ZiYmZlsiY2xpZW50IitiXXx8Z31yZXR1cm4gOT09PWYubm9kZVR5cGU/TWF0aC5tYXgoZi5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl0sZi5ib2R5WyJzY3JvbGwiK2JdLGYuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2JdLGYuYm9keVsib2Zmc2V0IitiXSxmLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitiXSk6dm9pZCAwPT09YT8oZz1jLmNzcyhmLGQpLGY9cGFyc2VGbG9hdChnKSxjLmlzTmFOKGYpP2c6Zik6dGhpcy5jc3MoZCwic3RyaW5nIj09PXR5cGVvZiBhP2E6YSsicHgiKX19KTtjLmZuLm9mZnNldE5vSVBhZEZpeD1jLmZuLm9mZnNldDtjLmZuLm9mZnNldElQYWRGaXg9Yy5mbi5vZmZzZXQ7L3dlYmtpdC4qbW9iaWxlL2kudGVzdChNYS51c2VyQWdlbnQpJiY1MzIuOT5wYXJzZUZsb2F0KGMuYnJvd3Nlci52ZXJzaW9uKSYmCiJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gbS5kb2N1bWVudEVsZW1lbnQmJihjLmZuLm9mZnNldElQYWRGaXg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldE5vSVBhZEZpeCgpO2EmJihhLnRvcC09cS5zY3JvbGxZLGEubGVmdC09cS5zY3JvbGxYKTtyZXR1cm4gYX0sYy5mbi5vZmZzZXQ9Yy5mbi5vZmZzZXRJUGFkRml4KTtyZXR1cm4gY30oKSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGgpe3ZhciBlPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZj1lLl9uYW1lc3BhY2V8fGUuYXR0cmlidXRlRXJyb3JzLGc9Zj9mKCJBbWF6b25VSVByb21pc2UiLCJBbWF6b25VSSIpOmU7Zy5ndWFyZEZhdGFsP2cuZ3VhcmRGYXRhbChoKShnLHdpbmRvdyk6Zy5leGVjdXRlKGZ1bmN0aW9uKCl7aChnLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGgsZSxmKXtoLnJlZ2lzdGVyKCIzcC1wcm9taXNlIixmdW5jdGlvbigpe2Z1bmN0aW9uIGcoKXt9ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBjKGEpe2lmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Iik7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIGZ1bmN0aW9uIik7dGhpcy5fc3RhdGU9MDt0aGlzLl9oYW5kbGVkPQohMTt0aGlzLl92YWx1ZT12b2lkIDA7dGhpcy5fZGVmZXJyZWRzPVtdO3EoYSx0aGlzKX1mdW5jdGlvbiBmKGEsYil7Zm9yKDszPT09YS5fc3RhdGU7KWE9YS5fdmFsdWU7MD09PWEuX3N0YXRlP2EuX2RlZmVycmVkcy5wdXNoKGIpOihhLl9oYW5kbGVkPSEwLGwoZnVuY3Rpb24oKXt2YXIgZD0xPT09YS5fc3RhdGU/Yi5vbkZ1bGZpbGxlZDpiLm9uUmVqZWN0ZWQ7aWYobnVsbD09PWQpKDE9PT1hLl9zdGF0ZT9uOmspKGIucHJvbWlzZSxhLl92YWx1ZSk7ZWxzZXt2YXIgbTt0cnl7bT1kKGEuX3ZhbHVlKX1jYXRjaChjKXtrKGIucHJvbWlzZSxjKTtyZXR1cm59bihiLnByb21pc2UsbSl9fSkpfWZ1bmN0aW9uIG4oYSxiKXt0cnl7aWYoYj09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4iKTtpZihiJiYoIm9iamVjdCI9PT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09PXR5cGVvZiBiKSl7dmFyIGQ9Yi50aGVuO2lmKGIgaW5zdGFuY2VvZgpjKXthLl9zdGF0ZT0zO2EuX3ZhbHVlPWI7cChhKTtyZXR1cm59aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBkKXtxKGgoZCxiKSxhKTtyZXR1cm59fWEuX3N0YXRlPTE7YS5fdmFsdWU9YjtwKGEpfWNhdGNoKG0pe2soYSxtKX19ZnVuY3Rpb24gayhhLGIpe2EuX3N0YXRlPTI7YS5fdmFsdWU9YjtwKGEpfWZ1bmN0aW9uIHAoYSl7Mj09PWEuX3N0YXRlJiYwPT09YS5fZGVmZXJyZWRzLmxlbmd0aCYmbChmdW5jdGlvbigpe2EuX2hhbmRsZWR8fHIoYS5fdmFsdWUpfSk7Zm9yKHZhciBiPTAsZD1hLl9kZWZlcnJlZHMubGVuZ3RoO2I8ZDtiKyspZihhLGEuX2RlZmVycmVkc1tiXSk7YS5fZGVmZXJyZWRzPW51bGx9ZnVuY3Rpb24gdChhLGIsZCl7dGhpcy5vbkZ1bGZpbGxlZD0iZnVuY3Rpb24iPT09dHlwZW9mIGE/YTpudWxsO3RoaXMub25SZWplY3RlZD0iZnVuY3Rpb24iPT09dHlwZW9mIGI/YjpudWxsO3RoaXMucHJvbWlzZT1kfWZ1bmN0aW9uIHEoYSxiKXt2YXIgZD0hMTt0cnl7YShmdW5jdGlvbihhKXtkfHwKKGQ9ITAsbihiLGEpKX0sZnVuY3Rpb24oYSl7ZHx8KGQ9ITAsayhiLGEpKX0pfWNhdGNoKGMpe2R8fChkPSEwLGsoYixjKSl9fWlmKCJmdW5jdGlvbiI9PT10eXBlb2YgZS5Qcm9taXNlKXJldHVybiBlLlByb21pc2U7dmFyIHU9c2V0VGltZW91dCxsPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZzZXRJbW1lZGlhdGV8fGZ1bmN0aW9uKGEpe3UoYSwwKX0scj1mdW5jdGlvbihhKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEpfTtjLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O2MucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgdGhpcy5jb25zdHJ1Y3RvcihnKTtmKHRoaXMsbmV3IHQoYSxiLGQpKTtyZXR1cm4gZH07Yy5hbGw9ZnVuY3Rpb24oYSl7dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7CnJldHVybiBuZXcgYyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGcoZSxmKXt0cnl7aWYoZiYmKCJvYmplY3QiPT09dHlwZW9mIGZ8fCJmdW5jdGlvbiI9PT10eXBlb2YgZikpe3ZhciBrPWYudGhlbjtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGspe2suY2FsbChmLGZ1bmN0aW9uKGEpe2coZSxhKX0sYyk7cmV0dXJufX1iW2VdPWY7MD09PS0taCYmYShiKX1jYXRjaChsKXtjKGwpfX1pZigwPT09Yi5sZW5ndGgpcmV0dXJuIGEoW10pO2Zvcih2YXIgaD1iLmxlbmd0aCxlPTA7ZTxiLmxlbmd0aDtlKyspZyhlLGJbZV0pfSl9O2MucmVzb2x2ZT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmIm9iamVjdCI9PT10eXBlb2YgYSYmYS5jb25zdHJ1Y3Rvcj09PWM/YTpuZXcgYyhmdW5jdGlvbihiKXtiKGEpfSl9O2MucmVqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYyhmdW5jdGlvbihiLGQpe2QoYSl9KX07Yy5yYWNlPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYyhmdW5jdGlvbihiLGQpe2Zvcih2YXIgYz0KMCxlPWEubGVuZ3RoO2M8ZTtjKyspYVtjXS50aGVuKGIsZCl9KX07Yy5fc2V0SW1tZWRpYXRlRm49ZnVuY3Rpb24oYSl7bD1hfTtjLl9zZXRVbmhhbmRsZWRSZWplY3Rpb25Gbj1mdW5jdGlvbihhKXtyPWF9O3JldHVybiBjfSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKG0pe3ZhciBuPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsQz1uLl9uYW1lc3BhY2V8fG4uYXR0cmlidXRlRXJyb3JzLGQ9Qz9DKCJBbWF6b25VSUJhc2VKUyIsIkFtYXpvblVJIik6bjtkLmd1YXJkRmF0YWw/ZC5ndWFyZEZhdGFsKG0pKGQsd2luZG93KTpkLmV4ZWN1dGUoZnVuY3Rpb24oKXttKGQsd2luZG93KX0pfSkoZnVuY3Rpb24obSxuLEMpe20ud2hlbigialF1ZXJ5IikucmVnaXN0ZXIoImEtYmFzZSIsZnVuY3Rpb24oZCl7cmV0dXJue3ZlcnNpb246ZnVuY3Rpb24oKXtyZXR1cm4iMy4wIn0sJDpkfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oInAtcmVjb3JkZXItZXZlbnRzIiwialF1ZXJ5IiwiYS1hbmFseXRpY3MiLCJhLXV0aWwiLCJhLWNvbnN0YW50cyIsInBydjphLXBvc3QtYXRmIikucmVnaXN0ZXIoInBydjphLWRlY2xhcmF0aXZlLWFuYWx5dGljcyIsZnVuY3Rpb24oZCxnLGssYyxoLGIpe2Z1bmN0aW9uIGUoKXtwKCk7Yy5vYmplY3RJc0VtcHR5KHIpfHwKKGcoIltkYXRhLWFjdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIik7cVthXT0hMH0pLHAoKSxyPXt9KX1mdW5jdGlvbiBwKCl7Yy5lYWNoKHIsZnVuY3Rpb24oZixsKXtxW2YuZGFOYW1lXSYmKGsuY291bnQoInVzYWdlOnR0aSIsZi5sYXRlbmN5KSxkZWxldGUgcltsXSxhW2xdPWYpfSl9dmFyIHQ9bi51ZV90MHx8bi5hUGFnZVN0YXJ0fHxEYXRlLm5vdygpLHI9e30sYT17fSxxPXt9O3JldHVybiAwPGQubGVuZ3RoJiZuLnVlP3tub3RpZnk6ZnVuY3Rpb24oZixsKXtpZihmJiZsJiYtMSE9PWMuaW5kZXhPZkFycmF5KGQsbCkpe3ZhciBxPWYrIi8iK2w7aWYoIWFbcV0mJiFyW3FdKXt2YXIgdT1EYXRlLm5vdygpLXQ7cltxXT17ZGFOYW1lOmYsZXZlbnRUeXBlOmwsbGF0ZW5jeTp1fTtiLmV4ZWN1dGUoZSl9fX19Ontub3RpZnk6aC5jb25zdGFudHMuTk9PUCxzZXRPcHRpb25zOmguY29uc3RhbnRzLk5PT1B9fSk7InVzZSBzdHJpY3QiOwptLnJlZ2lzdGVyKCJwcnY6YS1ndWFyZCIsZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZyhkLGMpe3JldHVybiBkLl9ndWFyZCYmImZ1bmN0aW9uIj09PXR5cGVvZiBjP2QuX2d1YXJkKGMpOmN9cmV0dXJue2ZuOmcsb2JqOmZ1bmN0aW9uKGQsYyl7aWYoIWQuX2d1YXJkKXJldHVybiBjO3ZhciBoPXt9LGI7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoaFtiXT1nKGQsY1tiXSkpO3JldHVybiBofX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJwLXJlY29yZGVyLWV2ZW50cyIsImEtYW5hbHl0aWNzIikucmVnaXN0ZXIoImEtdGltaW5nLWFuYWx5dGljcyIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKGIpe2NbYl09ITA7MCE9PWQubGVuZ3RoJiZuLnVldCYmbi51ZXgmJm4udWV0KCJiYiIsYixoKX12YXIgYz17fSxoPXt3YjoxfTtrKCJkZWNsYXJhdGl2ZSIpO2soIkEiKTtrKCJkcm9wZG93biIpO2soImNhcm91c2VsIik7cmV0dXJue3N0YXJ0V2lkZ2V0TG9nZ2luZzprLHN0b3BXaWRnZXRMb2dnaW5nOmZ1bmN0aW9uKGIpezAhPT0KZC5sZW5ndGgmJm4udWV0JiZuLnVleCYmYiBpbiBjJiYobi51ZXQoImNmIixiLGgpLG4udWV4KCJsZCIsYixoKSl9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oInAtcmVjb3JkZXItZXZlbnRzIiwialF1ZXJ5IiwiYS1hbmFseXRpY3MiLCJhLXV0aWwiLCJwcnY6YS1ldmVudC1jb250ZXh0IiwicHJ2OmEtcG9zdC1hdGYiKS5yZWdpc3RlcigiYS1ldmVudC1hbmFseXRpY3MiLGZ1bmN0aW9uKGQsZyxrLGMsaCxiKXtmdW5jdGlvbiBlKGEsZil7YT1hKyI6IitmO3JldHVybiBhIGluIHo/KGY9elthXSxkZWxldGUgelthXSxmKTpbXX1mdW5jdGlvbiBwKGEsZixsKXt2YXIgcT1lKGEsZik7aWYocSYmcS5sZW5ndGgpdHJ5e2suaW5jcmVtZW50KCJ1c2FnZTp0cnVlX3VkYWMiLHEubGVuZ3RoKTt2YXIgeD0iVXNlciBhdHRlbXB0ZWQgdG8gaW50ZXJhY3Qgd2l0aCBkZWNsYXJhdGl2ZSBhY3Rpb24gYmVmb3JlIGl0IHdhcyByZWFkeS4gKGF1aXx0cnVlX3VkYWM6IitmKyI6IithKyIpIHNlZTogaHR0cHM6Ly90aW55LmFtYXpvbi5jb20vMWpwcHp5a2k4IiwKdT17ZGFOYW1lOmEsZXZlbnRUeXBlOmYsZXZlbnRzOltdfTtjLmVhY2gocSxmdW5jdGlvbihhKXtiLmV4ZWN1dGUoZnVuY3Rpb24oKXthPWguZnJvbShhKS5jb2xsZWN0KHYpLmNvbGxlY3QoeSkuY29sbGVjdCh3KS5kdW1wKCk7dS5ldmVudHMucHVzaCh7YXRmOmEuaXNBVEYseHBhdGg6YS54cGF0aCxzZWxlY3RvcjphLmNzc1NlbGVjdG9yLGZlYXR1cmU6YS5mZWF0dXJlLGRhdGE6YS5kYURhdGEsZXZlbnRMYXRlbmN5OmEuZXZlbnRMYXRlbmN5LGhhbmRsZXJMYXRlbmN5Omx9KX0pfSk7Yi5leGVjdXRlKGZ1bmN0aW9uKCl7bS5sb2dFcnJvcihudWxsLHgsIkVSUk9SIixKU09OJiZKU09OLnN0cmluZ2lmeT9KU09OLnN0cmluZ2lmeSh1KToiIil9KX1jYXRjaChwKXt9fWZ1bmN0aW9uIHQoYSl7cmV0dXJuInVua25vd24iIT09dHlwZW9mIGEudHlwZX1mdW5jdGlvbiByKGEpe3JldHVybiBnLmV2ZW50LmZpeChhKX1mdW5jdGlvbiBhKGEpe3JldHVybi0xIT09Yy5pbmRleE9mQXJyYXkoZCwKYS50eXBlKX1mdW5jdGlvbiBxKGEpe3JldHVybiBhLnRhcmdldCE9PWRvY3VtZW50fWZ1bmN0aW9uIGYoYSl7cmV0dXJue2V2ZW50VHlwZTphLnR5cGV9fWZ1bmN0aW9uIGwoYSl7YT1nKGEudGFyZ2V0KS5jbG9zZXN0KCJbZGF0YS1hY3Rpb25dIikuZ2V0KDApO3JldHVybiB2b2lkIDA9PT1hP251bGw6YX1mdW5jdGlvbiB4KGEpe3JldHVybntkYU5hbWU6YS5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIil9fWZ1bmN0aW9uIHUoYSl7dmFyIGY9YS5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIik7cmV0dXJue2RhRGF0YTphLmdldEF0dHJpYnV0ZSgiZGF0YS0iK2YpfHwiIn19ZnVuY3Rpb24gdihhKXtyZXR1cm57aXNBVEY6Yy5pc0FURihhKX19ZnVuY3Rpb24geShhKXtyZXR1cm57eHBhdGg6Yy54cGF0aChhKSxjc3NTZWxlY3RvcjpjLmNzc1NlbGVjdG9yKGEpfX1mdW5jdGlvbiB3KGEpe3ZhciBmO2lmKGE9ZyhhKS5jbG9zZXN0KEIpLmdldCgwKSlmPWEuZ2V0QXR0cmlidXRlKEQpLApmfHwoYT1hLmlkKSYmYS5sZW5ndGg+QS5sZW5ndGgmJmEuaW5kZXhPZihBKT09PWEubGVuZ3RoLUEubGVuZ3RoJiYoZj1hLnNsaWNlKDAsYS5sZW5ndGgtQS5sZW5ndGgpKTtyZXR1cm57ZmVhdHVyZTpmfHwiIn19ZnVuY3Rpb24gRihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm57ZXZlbnRMYXRlbmN5OmF9fX12YXIgej17fSxCPSJbaWQkXHgzZF9mZWF0dXJlX2Rpdl0sLmZlYXR1cmUiLEQ9ImRhdGEtZmVhdHVyZS1uYW1lIixBPSJfZmVhdHVyZV9kaXYiLEg9bi51ZV90MHx8bi5hUGFnZVN0YXJ0fHxEYXRlLm5vdygpO3JldHVybntoYW5kbGU6ZnVuY3Rpb24oYyxiKXtpZigwIT09ZC5sZW5ndGgpezI+YXJndW1lbnRzLmxlbmd0aCYmKGI9RGF0ZS5ub3coKS1IKTt2YXIgZT0obmV3IGgoYykpLmZpbHRlcih0KS50cmFuc2Zvcm0ocikuZmlsdGVyKGEpLmZpbHRlcihxKS5jb2xsZWN0KGYpLmNvbGxlY3QoRihiKSkudHJhbnNmb3JtKGwpLmNvbGxlY3QoeCkuY29sbGVjdCh1KS5kdW1wKCk7CmlmKGUpe3ZhciBwPWUuZGFOYW1lKyI6IitlLmV2ZW50VHlwZTtwIGluIHp8fCh6W3BdPVtdKTt6W3BdLnB1c2goZSl9fX0sbm90aWZ5OmZ1bmN0aW9uKGEsZil7cChhLGYsRGF0ZS5ub3coKS1IKX19fSk7bS53aGVuKCJhLXV0aWwiLCJhLWNsYXNzIikucmVnaXN0ZXIoInBydjphLWV2ZW50LWNvbnRleHQiLGZ1bmN0aW9uKGQsZyl7dmFyIGs9Zy5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihjLGgpe3RoaXMuc3ViamVjdD1jO3RoaXMuY29sbGVjdGVkPWh8fHt9fSx0cmFuc2Zvcm06ZnVuY3Rpb24oYyl7aWYobnVsbD09PXRoaXMuc3ViamVjdClyZXR1cm4gdGhpczt2YXIgaDt0cnl7aD1jKHRoaXMuc3ViamVjdCl9Y2F0Y2goYil7cmV0dXJuIHRoaXMuc3ViamVjdD1udWxsLHRoaXN9dGhpcy5zdWJqZWN0PWg7cmV0dXJuIHRoaXN9LGZpbHRlcjpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0oZnVuY3Rpb24oaCl7cmV0dXJuIGMoaCk/aDpudWxsfSl9LGNvbGxlY3Q6ZnVuY3Rpb24oYyl7dmFyIGg9CnRoaXM7cmV0dXJuIHRoaXMudHJhbnNmb3JtKGZ1bmN0aW9uKGIpe3RyeXt2YXIgZT1jKGIpO2guY29sbGVjdGVkPWQuZXh0ZW5kKGguY29sbGVjdGVkLGUpfWNhdGNoKHApe31yZXR1cm4gYn0pfSxkdW1wOmZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuc3ViamVjdClyZXR1cm4gbnVsbDt0aGlzLmNvbGxlY3RlZC5fc3ViamVjdD10aGlzLnN1YmplY3Q7cmV0dXJuIHRoaXMuY29sbGVjdGVkfX0pO2suZnJvbT1mdW5jdGlvbihjKXtyZXR1cm4gbmV3IGsoYy5fc3ViamVjdCxjKX07cmV0dXJuIGt9KTsidXNlIHN0cmljdCI7bS5yZWdpc3RlcigicHJpdjphLXZpc2liaWxpdHkiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZChkKXtmb3IodmFyIGs9WyJoaWRkZW4iLCJ3ZWJraXRIaWRkZW4iLCJtb3pIaWRkZW4iLCJtc0hpZGRlbiIsIm9IaWRkZW4iXSxjPTA7YzxrLmxlbmd0aDtjKz0xKWlmKGtbY11pbiBkKXJldHVybiBrW2NdfXJldHVybiBmdW5jdGlvbihnKXt2YXIgaz1kKGcpO3JldHVybiBrPwpmdW5jdGlvbigpe3JldHVybiBnW2tdfTpmdW5jdGlvbigpe3JldHVybiExfX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLWJhc2UiLCJwcml2OmEtdmlzaWJpbGl0eSIpLnJlZ2lzdGVyKCJhLXV0aWwiLGZ1bmN0aW9uKGQsZyl7ZnVuY3Rpb24gayhhKXtpZigiIiE9PWEuaWQpcmV0dXJuJy8vKltAaWRceDNkIicrYS5pZCsnIl0nO2lmKGE9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpcmV0dXJuIi9odG1sIjt2YXIgcT1jKGEpLnBhcmVudCgpLmZpbmQoIiBceDNlICIrYS50YWdOYW1lKS5pbmRleChhKTtpZigtMT09PXEpdGhyb3ciY2FuIG5vdCBldmFsdWF0ZSB4cGF0aCBvZiBlbGVtZW50IGAiK2EudGFnTmFtZSsoYS5pZD8iIyIrYS5pZDoiIikrImAiO3JldHVybiBrKGEucGFyZW50Tm9kZSkrIi8iK2EudGFnTmFtZSsiWyIrKHErMSkrIl0ifXZhciBjPWQuJCxoPURhdGUubm93LGI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsbCx4KXtpZihudWxsIT09YSlpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaCYmCmEuZm9yRWFjaD09PUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKWEuZm9yRWFjaChsLHgpO2Vsc2UgaWYoYS5sZW5ndGg9PT0rYS5sZW5ndGgpZm9yKHZhciB1PTAsYz1hLmxlbmd0aDt1PGMmJiEodSBpbiBhJiZsLmNhbGwoeCxhW3VdLHUsYSk9PT1xKTt1KyspO2Vsc2UgZm9yKHUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KHUpJiZsLmNhbGwoeCxhW3VdLHUsYSk9PT17fSlicmVha312YXIgcT17fTtyZXR1cm57ZWFjaDphLG1hcDpmdW5jdGlvbihmLGwscSl7dmFyIGM9W107aWYobnVsbD09PWYpcmV0dXJuIGM7aWYoQXJyYXkucHJvdG90eXBlLm1hcCYmZi5tYXA9PT1BcnJheS5wcm90b3R5cGUubWFwKXJldHVybiBmLm1hcChsLHEpO2EoZixmdW5jdGlvbihhLGYsYil7Y1tjLmxlbmd0aF09bC5jYWxsKHEsYSxmLGIpfSk7Zi5sZW5ndGg9PT0rZi5sZW5ndGgmJihjLmxlbmd0aD1mLmxlbmd0aCk7cmV0dXJuIGN9LHJlZHVjZTpmdW5jdGlvbihmLGwscSxjKXt2YXIgYj0yPGFyZ3VtZW50cy5sZW5ndGg7Cm51bGw9PT1mJiYoZj1bXSk7aWYoQXJyYXkucHJvdG90eXBlLnJlZHVjZSYmZi5yZWR1Y2U9PT1BcnJheS5wcm90b3R5cGUucmVkdWNlKXJldHVybiBiP2YucmVkdWNlKGwscSk6Zi5yZWR1Y2UobCk7YShmLGZ1bmN0aW9uKGEsZixlKXtiP3E9bC5jYWxsKGMscSxhLGYsZSk6KHE9YSxiPSEwKX0pO2J8fG0uZXJyb3IoIlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiLCJBLnV0aWwiLCJyZWR1Y2UiKTtyZXR1cm4gcX0sZmlsdGVyOmZ1bmN0aW9uKGYsbCxxKXt2YXIgYz1bXTtpZihudWxsPT09ZilyZXR1cm4gYztpZihBcnJheS5wcm90b3R5cGUuZmlsdGVyJiZmLmZpbHRlcj09PUFycmF5LnByb3RvdHlwZS5maWx0ZXIpcmV0dXJuIGYuZmlsdGVyKGwscXx8Zik7YShmLGZ1bmN0aW9uKGEsYixlKXtsLmNhbGwocXx8ZixhLGIsZSkmJmMucHVzaChhKX0pO3JldHVybiBjfSxyYW5nZTpmdW5jdGlvbihhLGwscSl7dm9pZCAwPT09bCYmKGw9YXx8MCxhPTApOwpxPXF8fDE7bD1NYXRoLm1heChNYXRoLmNlaWwoKGwtYSkvcSksMCk7Zm9yKHZhciBjPUFycmF5KGwpLGI9MDtiPGw7YisrLGErPXEpY1tiXT1hO3JldHVybiBjfSxicmVha2VyOnF9fSgpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsZil7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkobnVsbCxsKX0sZil9cmV0dXJue3Rocm90dGxlOmZ1bmN0aW9uKGEsZixsKXt2YXIgYyxiLGUscD1udWxsLGQ9MDtsPWx8fHt9O3ZhciBrPWZ1bmN0aW9uKCl7ZD0hMT09PWwubGVhZGluZz8wOmgoKTtwPW51bGw7ZT1hLmFwcGx5KGMsYik7Yz1iPW51bGx9O3JldHVybiBmdW5jdGlvbigpe3ZhciBnPWgoKTtkfHwhMSE9PWwubGVhZGluZ3x8KGQ9Zyk7dmFyIHI9Zi0oZy1kKTtjPXRoaXM7Yj1hcmd1bWVudHM7MD49cj8oY2xlYXJUaW1lb3V0KHApLHA9bnVsbCxkPWcsZT1hLmFwcGx5KGMsCmIpLGM9Yj1udWxsKTpwfHwhMT09PWwudHJhaWxpbmd8fChwPXNldFRpbWVvdXQoayxyKSk7cmV0dXJuIGV9fSxzZXF1ZW5jZTpmdW5jdGlvbigpe3ZhciBhPVtdLnNsaWNlLGY9YS5jYWxsKGFyZ3VtZW50cykucmV2ZXJzZSgpLGw9dGhpcztyZXR1cm4gYi5yZWR1Y2UoZixmdW5jdGlvbihmLGMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBiPWEuY2FsbChhcmd1bWVudHMpO2IucHVzaChmKTtjLmFwcGx5KGwsYil9fSxmdW5jdGlvbigpe30pfSxkZWJvdW5jZTpmdW5jdGlvbihhLGYsbCl7dmFyIGMsYixlLHAsZCxrPWZ1bmN0aW9uKCl7dmFyIGc9aCgpLXA7ZzxmP2M9c2V0VGltZW91dChrLGYtZyk6KGM9bnVsbCxsfHwoZD1hLmFwcGx5KGUsYiksZT1iPW51bGwpKX07cmV0dXJuIGZ1bmN0aW9uKCl7ZT10aGlzO2I9YXJndW1lbnRzO3A9aCgpO3ZhciBnPWwmJiFjO2N8fChjPXNldFRpbWVvdXQoayxmKSk7ZyYmKGQ9YS5hcHBseShlLGIpLGU9Yj1udWxsKTtyZXR1cm4gZH19LGRlbGF5OmEsCmFuaW1hdGlvbkZyYW1lRGVsYXk6ZnVuY3Rpb24oYyl7cmV0dXJuIGEoYywxNil9LGludGVydmFsOmZ1bmN0aW9uKGEsZil7cmV0dXJuIHNldEludGVydmFsKGEsZil9LG9uY2U6ZnVuY3Rpb24oYSl7dmFyIGY9ITEsbDtyZXR1cm4gZnVuY3Rpb24oKXtmfHwoZj0hMCxsPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtyZXR1cm4gbH19LHJlc3Q6ZnVuY3Rpb24oYSxmKXtpZihhKXt2YXIgbD1NYXRoLm1heCh2b2lkIDA9PT1mP2EubGVuZ3RoLTE6ZiwwKTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGY9YXJndW1lbnRzLGM9LTEsYj1NYXRoLm1heChmLmxlbmd0aC1sLDApLGU9QXJyYXkoYik7KytjPGI7KWVbY109ZltjK2xdO3N3aXRjaChsKXtjYXNlIDA6cmV0dXJuIGEuY2FsbCh0aGlzLGUpO2Nhc2UgMTpyZXR1cm4gYS5jYWxsKHRoaXMsZlswXSxlKTtjYXNlIDI6cmV0dXJuIGEuY2FsbCh0aGlzLGZbMF0sZlsxXSxlKX1iPUFycmF5KGwrMSk7Zm9yKGM9LTE7KytjPGw7KWJbY109ZltjXTsKYltsXT1lO3JldHVybiBhLmFwcGx5KHRoaXMsYil9fX0scGFyc2VGdW5jdGlvbk5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZT8iYW5vbnltb3VzIj09PWEubmFtZT8iIjphLm5hbWU6KGE9YS50b1N0cmluZygpLm1hdGNoKC9eZnVuY3Rpb25ccyooW15ccyhdKykvKSk/YVsxXToiIn19fSgpO3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShmLGMpe2Y9Znx8e307Yz1jfHx7fTt2YXIgbD17fSxiO2ZvcihiIGluIGYpZi5oYXNPd25Qcm9wZXJ0eShiKSYmKGxbYl09Im9iamVjdCI9PT10eXBlb2YgZltiXSYmZltiXT9hKGZbYl0sY1tiXSk6ZltiXSE9PWNbYl0pO2ZvcihiIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShiKSYmIWxbYl0mJihsW2JdPSJvYmplY3QiPT09dHlwZW9mIGNbYl0mJmNbYl0/YShjW2JdLGZbYl0pOmNbYl0hPT1mW2JdKTtyZXR1cm4gbH1mdW5jdGlvbiBiKGEsZil7dmFyIGw7aWYoYT09PWYpcmV0dXJuITA7aWYoYy5pc0FycmF5KGEpKXtpZighYy5pc0FycmF5KGYpfHwKYS5sZW5ndGghPT1mLmxlbmd0aClyZXR1cm4hMTtmb3IobD1hLmxlbmd0aDtsLS07KWlmKCFiKGFbbF0sZltsXSkpcmV0dXJuITE7cmV0dXJuITB9aWYoYy5pc1BsYWluT2JqZWN0KGEpKXtpZighYy5pc1BsYWluT2JqZWN0KGYpfHxjLmlzRW1wdHlPYmplY3QoYSkmJiFjLmlzRW1wdHlPYmplY3QoZikpcmV0dXJuITE7Zm9yKGwgaW4gYSlpZighYihhW2xdLGZbbF0pKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGYoYSl7aWYoISgiZnVuY3Rpb24iPT09dHlwZW9mIGF8fCJvYmplY3QiPT09dHlwZW9mIGEmJmEpKXJldHVybltdO2lmKE9iamVjdC5rZXlzKXJldHVybiBPYmplY3Qua2V5cyhhKTt2YXIgZj1bXSxjO2ZvcihjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmZi5wdXNoKGMpO3JldHVybiBmfWZ1bmN0aW9uIGwoYSxmLGMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGYse3ZhbHVlOmMsd3JpdGFibGU6ITF9KTtyZXR1cm4gY31mdW5jdGlvbiBlKGEsZixjKXthLmhhc093blByb3BlcnR5KGYpfHwKKGFbZl09Yyk7cmV0dXJuIGN9cmV0dXJue2tleXM6Zix2YWx1ZXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWYoYSksbD1BcnJheShjLmxlbmd0aCksYj0wO2I8Yy5sZW5ndGg7YisrKWxbYl09YVtjW2JdXTtyZXR1cm4gbH0sZXh0ZW5kOmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLnVuc2hpZnQuY2FsbChhcmd1bWVudHMsITApO3JldHVybiBjLmV4dGVuZC5hcHBseShjLGFyZ3VtZW50cyl9LG1peGluOmZ1bmN0aW9uKGEsZixjKXtpZihjKWZvcih2YXIgbD0wLGI9Yy5sZW5ndGg7bDxiO2wrKylhW2NbbF1dPWZbY1tsXV07ZWxzZSBmb3IobCBpbiBmKSJmdW5jdGlvbiI9PT10eXBlb2YgZltsXSYmKGFbbF09ZltsXSl9LGRpZmY6YSxlcXVhbHM6Yixjb3B5OmZ1bmN0aW9uKGEpe3JldHVybiBjLmlzQXJyYXkoYSk/Yy5leHRlbmQoITAsW10sYSk6Yy5pc1BsYWluT2JqZWN0KGEpP2MuZXh0ZW5kKCEwLHt9LGEpOmF9LGluZGV4T2ZBcnJheTpmdW5jdGlvbihhLGYsYyl7aWYoQXJyYXkucHJvdG90eXBlLmluZGV4T2YmJgphLmluZGV4T2Y9PT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gYS5pbmRleE9mKGYsYyk7YSYmYSBpbnN0YW5jZW9mIEFycmF5fHxtLmVycm9yKCJJbnZhbGlkIGFyciBwYXNzZWQgdG8gQS5pbmRleE9mQXJyYXk6ICIrYSwiQS51dGlsIiwiaW5kZXhPZkFycmF5Iik7Yz1wYXJzZUludChjLDEwKTtjPWlzTmFOKGMpPzA6YztpZighaXNGaW5pdGUoYykpcmV0dXJuLTE7Zm9yKHZhciBsPWEubGVuZ3RoO2M8bDtjKyspaWYoYVtjXT09PWYpcmV0dXJuIGM7cmV0dXJuLTF9LGlzQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheShhKToiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfSxpc0Zpbml0ZU51bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhJiYhaXNOYU4oYSkmJmlzRmluaXRlKGEpfSxvYmplY3RJc0VtcHR5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgZiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZikpcmV0dXJuITE7CnJldHVybiEwfSxjb25zdFByb3A6ImZ1bmN0aW9uIj09PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHk/bDplfX0oKSxwPWZ1bmN0aW9uKCl7dmFyIGE9eyJceDI2IjoiXHgyNmFtcDsiLCJceDNjIjoiXHgyNmx0OyIsIlx4M2UiOiJceDI2Z3Q7IiwnIic6Ilx4MjZxdW90OyIsIiciOiJceDI2IzM5OyIsIi8iOiJceDI2I3gyRjsifSxjPS9eXHMrLyxmPS9ccyskLyxsPW5ldyBSZWdFeHAoIlsiK2Uua2V5cyhhKS5qb2luKCIiKSsiXSIsImciKSxiPS8oWyEiIyQlJidcKFwpKissLi86Ozw9Pj9AXFtcXFxdXmB7fH1+XSkvZztyZXR1cm57dHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS50cmltP1N0cmluZy5wcm90b3R5cGUudHJpbS5jYWxsKGEpOmEucmVwbGFjZShjLCIiKS5yZXBsYWNlKGYsIiIpfSxjb250YWluczpmdW5jdGlvbihhLGYpe3JldHVybi0xIT09KCIiK2EpLmluZGV4T2YoZil9LGVzY2FwZUh0bWw6ZnVuY3Rpb24oZil7cmV0dXJuKCIiK2YpLnJlcGxhY2UobCwKZnVuY3Rpb24oZil7cmV0dXJuIGFbZl19KX0sZXNjYXBlSnF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnJlcGxhY2UoYiwiXFwkMSIpfX19KCksdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPXt9O2Zvcih2YXIgYT0oZG9jdW1lbnQuY29va2llfHwiIikuc3BsaXQoIjsiKSxsPWEubGVuZ3RoLTE7MDw9bDtsLS0pe3ZhciBiPWFbbF0uc3BsaXQoIlx4M2QiKSxlPXAudHJpbShiWzBdKTtpZihlKXt2YXIgaD1jLGI9Yi5zbGljZSgxKS5qb2luKCJceDNkIiksYj1wLnRyaW0oYik7L14iLy50ZXN0KGIpJiYoYj1iLnNsaWNlKDEsLTEpLnJlcGxhY2UoL1xcKC4pL2csIiQxIikpO2I9bi5kZWNvZGVVUklDb21wb25lbnQoYik7aFtlXT1ifX19dmFyIGM7cmV0dXJue2dldDpmdW5jdGlvbihmKXtjfHxhKCk7cmV0dXJuIGNbZl19LGdldEFsbDpmdW5jdGlvbigpe2N8fGEoKTtyZXR1cm4gZS5leHRlbmQoe30sYyl9LHJlZnJlc2g6ZnVuY3Rpb24oKXtjPW51bGx9fX0oKSwKcj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZha2VlbGVtZW50IiksYz17dHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIixNb3pUcmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIixXZWJraXRUcmFuc2l0aW9uOiJ3ZWJraXRUcmFuc2l0aW9uRW5kIn0sZj1udWxsO3JldHVybntnZXRUcmFuc2l0aW9uRW5kRXZlbnQ6ZnVuY3Rpb24oKXsvVUNCcm93c2VyLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZj1jLldlYmtpdFRyYW5zaXRpb24pO2lmKG51bGw9PT1mKWZvcih2YXIgYiBpbiBjKWlmKHZvaWQgMCE9PWEuc3R5bGVbYl0pe2Y9Y1tiXTticmVha31yZXR1cm4gZn19fSgpO2c9Zyhkb2N1bWVudCk7cmV0dXJue25vdzpoLGV4dGVuZDplLmV4dGVuZCxtaXhpbjplLm1peGluLGNvcHk6ZS5jb3B5LGNvbnN0UHJvcDplLmNvbnN0UHJvcCxkaWZmOmUuZGlmZixlcXVhbHM6ZS5lcXVhbHMsb2JqZWN0SXNFbXB0eTplLm9iamVjdElzRW1wdHksCmluZGV4T2ZBcnJheTplLmluZGV4T2ZBcnJheSxpc0FycmF5OmUuaXNBcnJheSxpc0Zpbml0ZU51bWJlcjplLmlzRmluaXRlTnVtYmVyLGtleXM6ZS5rZXlzLHZhbHVlczplLnZhbHVlcyx4cGF0aDprLGNzc1NlbGVjdG9yOmZ1bmN0aW9uKGEpe3ZhciBjPVthLnRhZ05hbWV8fCIiXTthLmNsYXNzTmFtZSYmYS5jbGFzc05hbWUudHJpbSYmYy5wdXNoKCIuIithLmNsYXNzTmFtZS50cmltKCkucmVwbGFjZSgvXHMrL2csIi4iKSk7YS5pZCYmYy5wdXNoKCIjIithLmlkKTtyZXR1cm4gYy5qb2luKCIiKX0scGFyc2VKU09OOmZ1bmN0aW9uKGEpe3JldHVybiBjLnBhcnNlSlNPTihhKX0sdGhyb3R0bGU6ZC50aHJvdHRsZSxzZXF1ZW5jZTpkLnNlcXVlbmNlLGRlYm91bmNlOmQuZGVib3VuY2UsZGVsYXk6ZC5kZWxheSxhbmltYXRpb25GcmFtZURlbGF5OmQuYW5pbWF0aW9uRnJhbWVEZWxheSxpbnRlcnZhbDpkLmludGVydmFsLG9uY2U6ZC5vbmNlLHJlc3Q6ZC5yZXN0LHRyaW06cC50cmltLApjb250YWluczpwLmNvbnRhaW5zLGVzY2FwZUh0bWw6cC5lc2NhcGVIdG1sLGVzY2FwZUpxdWVyeVNlbGVjdG9yOnAuZXNjYXBlSnF1ZXJ5U2VsZWN0b3IsbWFwOmIubWFwLHJlZHVjZTpiLnJlZHVjZSxmaWx0ZXI6Yi5maWx0ZXIscmFuZ2U6Yi5yYW5nZSxlYWNoOmIuZWFjaCxicmVha2VyOmIuYnJlYWtlcixvblNjcmVlbjpmdW5jdGlvbihhLGIpe2I9Im51bWJlciI9PT10eXBlb2YgYiYmIWlzTmFOKGIpJiZpc0Zpbml0ZShiKT9iOjEwMDt2YXIgZj1jKGEpO2lmKCFmLmlzKCI6dmlzaWJsZSIpKXJldHVybiExO3ZhciBsPWMobik7YT1sLnNjcm9sbFRvcCgpO3ZhciBsPW4uaW5uZXJIZWlnaHQ/bi5pbm5lckhlaWdodDpsLmhlaWdodCgpLGU9YStsO2EtPWI7ZSs9YjtiPWYub2Zmc2V0KCkudG9wO3ZhciBmPWYuaGVpZ2h0KCkscD1iK2Y7cmV0dXJuIGI+PWEmJmI8ZXx8cD5hJiZwPD1lfHxmPmwmJmI8PWEmJnA+PWV9LGlzQVRGOmZ1bmN0aW9uKGEsYil7Yj0ibnVtYmVyIj09PXR5cGVvZiBiJiYKIWlzTmFOKGIpJiZpc0Zpbml0ZShiKT9iOjEwMDt2YXIgZj1jKG4pO2I9KG4uaW5uZXJIZWlnaHQ/bi5pbm5lckhlaWdodDpmLmhlaWdodCgpKStiO2E9YyhhKS5vZmZzZXQoKS50b3A7cmV0dXJuIDA8PWEmJmE8Yn0sc2V0Q3NzSW1wb3J0YW50OmZ1bmN0aW9uKGEsYyxiKXthPWEuanF1ZXJ5P2FbMF06YTsidW5kZWZpbmVkIiE9PXR5cGVvZiBhJiYoYT1hLnN0eWxlLGEuY3NzVGV4dD1hLmNzc1RleHQucmVwbGFjZShuZXcgUmVnRXhwKGMrIlxccyo6XFxzKlsuXjtdKihcXHMqOyk/IiwiZ21pIiksIiIpLGEuY3NzVGV4dCs9YysiOiAiK2IrIiAhaW1wb3J0YW50OyIpfSxnZXRUcmFuc2l0aW9uRW5kRXZlbnQ6ci5nZXRUcmFuc2l0aW9uRW5kRXZlbnQsY29va2llczp0LHdpZGVzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4gMDxjKCJodG1sLmEtd3MiKS5sZW5ndGh9LGlzUGFnZUhpZGRlbjpnLHBhcnNlRnVuY3Rpb25OYW1lOmQucGFyc2VGdW5jdGlvbk5hbWV9fSk7InVzZSBzdHJpY3QiOwptLndoZW4oInAtZGV0ZWN0IiwiYS11dGlsIikucmVnaXN0ZXIoImEtZGV0ZWN0IixmdW5jdGlvbihkLGcpe3ZhciBrO3RyeXtrPW5hdmlnYXRvci51c2VyQWdlbnR9Y2F0Y2gocCl7az0iIn12YXIgYz1nLmNvcHkoZCksaD1mdW5jdGlvbigpe3ZhciBjPS8oPzpBbmRyb2lkXHMrfFdpbmRvd3Nob3AuKkFuZHJvaWRcL3xBbmRyb2lkXC8pKFxkK1wuXGQrKD86XC5cZCspKikvLmV4ZWMoayk7cmV0dXJuIGMmJmNbMV19LGI9L1RyaWRlbnQvLnRlc3QoayksZT17fTtnLmVhY2goe2lzQW1hem9uQXBwOmZ1bmN0aW9uKCl7cmV0dXJuLyhXaW5kb3dzaG9wfEFtYXpvbnxBbWF6b25cLmNvbSlcLy8udGVzdChnLmNvb2tpZXMuZ2V0KCJhbXpuLWFwcC1pZCIpKX0saXNHZW41QXBwOmZ1bmN0aW9uKCl7cmV0dXJuL1dpbmRvd3Nob3AuKig/OktGT1R8S0ZUSHxLRkpXQXxLRkpXSXxLRlRUKS8udGVzdChrKX0sYW5kcm9pZFZlcnNpb246ZnVuY3Rpb24oKXtyZXR1cm4gaCgpfSxpc0FuZHJvaWRLaXRrYXRQbHVzOmZ1bmN0aW9uKCl7dmFyIGM9CmgoKTtyZXR1cm4gYyYmbnVsbCE9PWMubWF0Y2goLyheNFwuWzQtOV18Xls1LTldKS8pfSxpc0Nocm9tZTpmdW5jdGlvbigpe3JldHVybi9DaHJvbWUvLnRlc3Qoayl9LGNocm9tZVZlcnNpb246ZnVuY3Rpb24oKXt2YXIgYz0vQ2hyb21lXC8oXGQrXC5cZCsoPzpcLlxkKykqKS8uZXhlYyhrKTtpZihjWzFdKXJldHVybiBjWzFdfSxpc1VDQnJvd3NlcjpmdW5jdGlvbigpe3JldHVybi9VQ0Jyb3dzZXIvLnRlc3Qoayl9LGlzU2FmYXJpOmZ1bmN0aW9uKCl7dmFyIGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO3JldHVybiEoIk1vekFwcGVhcmFuY2UiaW4gYykmJiJ3ZWJraXRBcHBlYXJhbmNlImluIGMmJi9eQXBwbGUvLnRlc3QobmF2aWdhdG9yLnZlbmRvcil9LGlzQW5kcm9pZFN0b2NrR3Vlc3M6ZnVuY3Rpb24oKXt2YXIgYj0hMTtjLmNhcGFiaWxpdGllcy5hbmRyb2lkJiYhL0Nocm9tZXxPcGVyYXxGaXJlZm94fFVDQnJvd3Nlci8udGVzdChrKSYmKGI9L0FwcGxlV2ViS2l0XC8oXGQrXC5cZCspLy5leGVjKGspLApiPWJbMV0mJiI1MzUiPmJbMV0pO3JldHVybiBifSxpc0ZpcmVmb3g6ZnVuY3Rpb24oKXtyZXR1cm4vRmlyZWZveC8udGVzdChrKX0saXNBbmRyb2lkOmZ1bmN0aW9uKCl7cmV0dXJuIGMuY2FwYWJpbGl0aWVzLmFuZHJvaWR9LGlzT2xkQW5kcm9pZDpmdW5jdGlvbigpe3JldHVybi9BbmRyb2lkXHNbMTJdLy50ZXN0KGspfSxpc0lFOmZ1bmN0aW9uKCl7cmV0dXJuIGJ9LGlzSUUxMDpmdW5jdGlvbigpe3JldHVybiBiJiYib25tc3BvaW50ZXJ1cCJpbiBkb2N1bWVudCYmISgib25wb2ludGVydXAiaW4gZG9jdW1lbnQpfSxpc0lFMTBQbHVzOmZ1bmN0aW9uKCl7cmV0dXJuIGImJigib25wb2ludGVydXAiaW4gZG9jdW1lbnR8fCJvbm1zcG9pbnRlcnVwImluIGRvY3VtZW50KX0saXNJRTExUGx1czpmdW5jdGlvbigpe3JldHVybiBiJiYib25wb2ludGVydXAiaW4gZG9jdW1lbnR9LGlzaU9TODpmdW5jdGlvbigpe3JldHVybiBjLmNhcGFiaWxpdGllcy5pb3MmJi9WZXJzaW9uXC84XC4vLnRlc3Qoayl9LAppc0lFVG91Y2hDYXBhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXMmJi9Ub3VjaDsvLnRlc3Qoayl9LGlzTWV0cm9JRUd1ZXNzOmZ1bmN0aW9uKCl7dmFyIGI9ITA7dHJ5e2I9bmV3IEFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIil9Y2F0Y2goZSl7Yj0hMX1yZXR1cm4gYy5jYXBhYmlsaXRpZXMuaXNJRTEwUGx1cyYmIWMuY2FwYWJpbGl0aWVzLm1vYmlsZSYmIWJ9LHBvaW50ZXJQcmVmaXg6ZnVuY3Rpb24oKXtyZXR1cm4ib25tc3BvaW50ZXJ1cCJpbiBkb2N1bWVudHx8Im9ucG9pbnRlcnVwImluIGRvY3VtZW50PyJvbnBvaW50ZXJ1cCJpbiBkb2N1bWVudD8icG9pbnRlciI6Ik1TUG9pbnRlciI6ITF9LGFjdGlvbk1vZGU6ZnVuY3Rpb24oKXt2YXIgYj1jLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4O3JldHVybiBiP2I6Yy5jYXBhYmlsaXRpZXMudG91Y2g/InRvdWNoIjoibW91c2UifX0sZnVuY3Rpb24oYixlKXt2YXIgaD1jLmNhcGFiaWxpdGllcywKYTt0cnl7YT1iKCl9Y2F0Y2gocSl7YT0hMX1oW2VdPWF9KTtnLmVhY2goe3N0YXJ0Onttb3VzZToiZG93biIsdG91Y2g6InN0YXJ0Iixwb2ludGVyOiJkb3duIixNU1BvaW50ZXI6IkRvd24ifSxlbmQ6e21vdXNlOiJ1cCIsdG91Y2g6ImVuZCIscG9pbnRlcjoidXAiLE1TUG9pbnRlcjoiVXAifSxtb3ZlOnttb3VzZToibW92ZSIsdG91Y2g6Im1vdmUiLHBvaW50ZXI6Im1vdmUiLE1TUG9pbnRlcjoiTW92ZSJ9LGVudGVyOnttb3VzZToiZW50ZXIiLHRvdWNoOiJlbnRlciIscG9pbnRlcjoiZW50ZXIifSxsZWF2ZTp7bW91c2U6ImxlYXZlIix0b3VjaDoibGVhdmUiLHBvaW50ZXI6ImxlYXZlIn0sY2FuY2VsOnt0b3VjaDoiY2FuY2VsIixwb2ludGVyOiJjYW5jZWwiLE1TUG9pbnRlcjoiQ2FuY2VsIn0sb3Zlcjp7bW91c2U6Im92ZXIiLHBvaW50ZXI6Im92ZXIiLE1TUG9pbnRlcjoiT3ZlciJ9LG91dDp7bW91c2U6Im91dCIscG9pbnRlcjoib3V0IixNU1BvaW50ZXI6Ik91dCJ9fSxmdW5jdGlvbihiLApoKXt2YXIgZD1jLmNhcGFiaWxpdGllcy5hY3Rpb25Nb2RlLGE9InN0cmluZyI9PT10eXBlb2YgYj9iOmJbZF07ZVtoXT1hP2QrYTp2b2lkIDA9PT1iLm1vdXNlPyIiOiJtb3VzZSIrYi5tb3VzZX0pO2MuYWN0aW9uPWU7ZD17fTsicG9pbnRlciI9PT1jLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4PyhkLnRvdWNoPSJ0b3VjaCIsZC5wZW49InBlbiIsZC5tb3VzZT0ibW91c2UiLGQudW5rbm93bj0iIik6Ik1TUG9pbnRlciI9PT1jLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4JiYoZC50b3VjaD0yLGQucGVuPTMsZC5tb3VzZT00KTtjLnBvaW50ZXJUeXBlPWQ7cmV0dXJuIGN9KTsidXNlIHN0cmljdCI7bS53aGVuKCJwcnY6YS1ndWFyZCIpLnJlZ2lzdGVyKCJhLWRlZmVyIixmdW5jdGlvbihkKXtmdW5jdGlvbiBnKGIpe3ZhciBlPTAsZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZyhiKX0sMCk7aWYoMD09PWIubGVuZ3RoKWNsZWFyVGltZW91dChkKSxjPSExO2Vsc2V7dmFyIGs9RGF0ZS5ub3coKTsKYi5zaGlmdCgpLmNhbGwoKTtoKz1EYXRlLm5vdygpLWs7NTA8aCYmKGU9NTAsaD0wKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZyhiKX0sZSk7Y2xlYXJUaW1lb3V0KGQpfX12YXIgaz1bXSxjPSExLGg9MDtyZXR1cm57ZGVmZXI6ZnVuY3Rpb24oYil7ay5wdXNoKGQuZm4odGhpcyxiKSk7Y3x8KGM9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2coayl9LDApKX0scGF1c2VEZWZlcnJlZDpmdW5jdGlvbigpe30sZXhlY3V0ZURlZmVycmVkOmZ1bmN0aW9uKCl7fX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJqUXVlcnkiLCJhLXV0aWwiLCJwLWRldGVjdCIsImEtZXZlbnQtcmV2aXNlZC1oYW5kbGluZyIpLnJlZ2lzdGVyKCJhLWV2ZW50cyIsZnVuY3Rpb24oZCxnLGssYyl7ZnVuY3Rpb24gaChhLGMpeyExIT09YyYmci5tYWtlVG9waWNUaW1lU2xpY2VkKGEpO3BbYV09ITA7ci5zdWJzY3JpYmUoYSxmdW5jdGlvbigpe20ucmVnaXN0ZXIoYSxmdW5jdGlvbigpe3ZhciBhPW4uYVBhZ2VTdGFydHx8Cmcubm93KCk7cmV0dXJue3RpbWU6Zy5ub3coKS1hfX0pfSk7ci5wdWJsaXNoKGEpO3IudW5zdWJzY3JpYmUoYSl9ZnVuY3Rpb24gYigpe3AuYmVmb3JlTG9hZCYmcC5sb2FkfHwoaCgiYmVmb3JlTG9hZCIpLGgoImxvYWQiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aCgiYmVmb3JlQWZ0ZXJMb2FkIik7aCgiYWZ0ZXJMb2FkIil9LDE1MDApKX1mdW5jdGlvbiBlKGEsYyl7dmFyIGI9dGhpcy5vbjt0aGlzLm9uPWZ1bmN0aW9uKCl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0aGlzLm9uLl9ndWFyZD1hO3RoaXMub24uX2xvZ0Vycm9yPWM7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKHRoaXMub25bZV09YltlXSk7dGhpcy5jb25zdHJ1Y3Rvcj12b2lkIDB9dmFyIHA9e30sdD1kKG4pLHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2Zvcih2YXIgYyxmPVtdLGw9MCxlPXIubGVuZ3RoO2w8ZTtsKyspYz1yW2xdLmlkLGIhPT1jJiZmLnB1c2gocltsXSk7cj0KZn1mdW5jdGlvbiBiKGEsYyl7Yz1bYywiRXZlbnQgZXhlY3V0aW9uIGZhaWxlZCBmb3IgZXZlbnQgIithLnRvcGljLCJGQVRBTCJdO2EubG9nRXJyb3I/YS5sb2dFcnJvci5hcHBseShhLGMpOm0ubG9nRXJyb3IuYXBwbHkobSxjKX1mdW5jdGlvbiBlKGMpe2Zvcih2YXIgcT1zZXRUaW1lb3V0KGUsMCksaD1nLm5vdygpLGQ7dm9pZCAwIT09KGQ9ci5zaGlmdCgpKTspdHJ5e2lmKCExPT09ZC5mbi5hcHBseShuLGQuYXJncykmJihjbGVhclRpbWVvdXQocSksYShkLmlkKSksITA9PT1jJiY1MDw9Zy5ub3coKS1oKXtjbGVhclRpbWVvdXQocSk7Zy5kZWxheShlLDE1KTtyZXR1cm59fWNhdGNoKGspe2IoZCxrKTtyZXR1cm59Y2xlYXJUaW1lb3V0KHEpO3A9ITF9ZnVuY3Rpb24gaCgpe2Zvcih2YXIgYz1nLm5vdygpLGU7dm9pZCAwIT09KGU9ci5zaGlmdCgpKTspdHJ5e2lmKCExPT09ZS5mbi5hcHBseShuLGUuYXJncykmJmEoZS5pZCksci5sZW5ndGgmJjUwPD1nLm5vdygpLWMpe2cuZGVsYXkoaCwKMTUpO3JldHVybn19Y2F0Y2gocSl7YihlLHEpfXA9ITF9ZnVuY3Rpb24gZChhKXtmb3IodmFyIGM7dm9pZCAwIT09KGM9YS5zaGlmdCgpKTspdHJ5e2lmKCExPT09Yy5mbi5hcHBseShuLGMuYXJncykpYnJlYWt9Y2F0Y2goZil7YihjLGYpfX12YXIgcT17fSxrPTAscD0hMSxyPVtdO3JldHVybntwdWJsaXNoOmZ1bmN0aW9uKGEpe3ZhciBiPXFbYV07aWYoYil7dmFyIGY9Yi5pc1RpbWVTbGljZWQsbD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZz1rKyssdD1bXSxuPWZ1bmN0aW9uKGMsYil7Yi5wdXNoKHt0b3BpYzphLGlkOmcsZm46Yy5ndWFyZD9jLmd1YXJkKGMuZm4pOmMuZm4sYXJnczpsLGxvZ0Vycm9yOmMubG9nRXJyb3J9KX07aWYoZilmb3IodmFyIG07dm9pZCAwIT09KG09Yi5zaGlmdCgpKTspbihtLHIpO2Vsc2V7bT0wO2Zvcih2YXIgRz1iLmxlbmd0aDttPEc7bSsrKW4oYlttXSxjP3Q6cil9Yz9mP3B8fChwPSEwLGgoKSk6ZCh0KTpwfHwocD0hMCwKZShmKSl9fSxzdWJzY3JpYmU6ZnVuY3Rpb24oYSxjLGIpe3FbYV18fChxW2FdPVtdKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpcmV0dXJuIHFbYV0udW5zaGlmdCh7Zm46Yyxsb2dFcnJvcjpiJiZiLmxvZ0Vycm9yLGd1YXJkOmImJmIuZ3VhcmR9KSx7ZXZlbnQ6YSxjYWxsYmFjazpjfX0sdW5zdWJzY3JpYmU6ZnVuY3Rpb24oYSxjKXt2YXIgYjtmb3IoYT1hLnNwbGl0KCIgIik7dm9pZCAwIT09KGI9YS5wb3AoKSk7KWlmKHFbYl0paWYoYyl7Yj1xW2JdO2Zvcih2YXIgZj0wLGw9Yi5sZW5ndGg7ZjxsO2YrKyliW2ZdJiZiW2ZdLmZuPT09YyYmYi5zcGxpY2UoZi0tLDEpfWVsc2UgcVtiXT1bXX0saXNTdWJzY3JpYmVkOmZ1bmN0aW9uKGEpe3JldHVybiBhIGluIHEmJjA8cVthXS5sZW5ndGh9LG1ha2VUb3BpY1RpbWVTbGljZWQ6ZnVuY3Rpb24oYSl7cVthXXx8KHFbYV09W10pO3FbYV0uaXNUaW1lU2xpY2VkPSEwfX19KCksYT1mdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZj0KYS5zcGxpdCgiICIpLGU9W10scT1jLGQ9dGhpcz97bG9nRXJyb3I6dGhpcy5fbG9nRXJyb3IsZ3VhcmQ6dGhpcy5fZ3VhcmR9Ont9O2ZvcighMD09PWImJihxPWZ1bmN0aW9uKCl7Yy5hcHBseShuLGFyZ3VtZW50cyk7ci51bnN1YnNjcmliZShhLHEpfSk7dm9pZCAwIT09KGI9Zi5wb3AoKSk7KXBbYl0/KHIuc3Vic2NyaWJlKGIsYyxkKSxyLnB1Ymxpc2goYiksci51bnN1YnNjcmliZShiKSk6ZS5wdXNoKHIuc3Vic2NyaWJlKGIscSxkKS5ldmVudCk7cmV0dXJue2V2ZW50OmUuam9pbigiICIpLGNhbGxiYWNrOnF9fTtnLmVhY2goInJlYWR5IGxvYWQgdW5sb2FkIGFmdGVyTG9hZCBzY3JvbGwgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIHpvb20iLnNwbGl0KCIgIiksZnVuY3Rpb24oYixjKXthW2JdPWZ1bmN0aW9uKCl7YS5hcHBseSh0aGlzLFtiXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19KTtyZXR1cm4gYX0oKSxxPWcub25jZShmdW5jdGlvbigpe2sucmVzcG9uc2l2ZUdyaWRFbmFibGVkKCkmJgprLnRvZ2dsZVJlc3BvbnNpdmVHcmlkKCEwKTtoKCJiZWZvcmVSZWFkeSIpO2goInJlYWR5Iik7aCgiYWZ0ZXJSZWFkeSIpOyJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlJiZiKCl9KTtkKGRvY3VtZW50KS5yZWFkeShxKTttLndoZW4oImEtYm9keUJlZ2luIikuZXhlY3V0ZShmdW5jdGlvbigpe2goImJvZHlCZWdpbiIpfSk7bS53aGVuKCJhLWRvbXJlYWR5IikuZXhlY3V0ZShxKTt0LmxvYWQoYik7dC51bmxvYWQoZnVuY3Rpb24oKXtoKCJ1bmxvYWQiLCExKX0pO2UucHJvdG90eXBlPXtpc0xpc3RlbmluZzpyLmlzU3Vic2NyaWJlZCxvbjphLG9uZTpmdW5jdGlvbihiLGMpe3ZhciBlPWIuc3BsaXQoIiAiKTtpZigxPGUubGVuZ3RoKW0uZXJyb3IoIkEub25lIG9ubHkgYWNjZXB0cyBhIHNpbmdsZSBldmVudCBuYW1lLCBidXQgd2FzIHByb3ZpZGVkIHdpdGg6ICIrZS5sZW5ndGgrIiwgKCIrYisiKSIsIkEuZXZlbnRzIiwib25lIik7ZWxzZSByZXR1cm4gYShiLGMsITApfSwKb2ZmOmZ1bmN0aW9uKGEsYil7dmFyIGM7Im9iamVjdCI9PT10eXBlb2YgYT8oYz1hLmV2ZW50LGE9YS5jYWxsYmFjayk6KGM9YSxhPWIpO3JldHVybiByLnVuc3Vic2NyaWJlKGMsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyLnB1Ymxpc2guYXBwbHkobixhcmd1bWVudHMpfSxldmVudHM6e2RlZmF1bHRzOntpbnB1dDoiY2hhbmdlIixzZWxlY3Q6ImNoYW5nZSIsYToiY2xpY2siLGJ1dHRvbjoiY2xpY2siLGZvcm06InN1Ym1pdCJ9fX07ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTtyZXR1cm4gZS5wcm90b3R5cGV9KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLXV0aWwiLCJhLWV2ZW50cyIpLnJlZ2lzdGVyKCJhLXByZWZpeCIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKGIpe3JldHVybiBiLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLSguKS9nLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGMudG9VcHBlckNhc2UoKX0pfXZhciBjPXt0cmFuc2l0aW9uZW5kOm51bGx9LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsCmI9e30sZT1bIm8iLCJtcyIsIm1veiIsIndlYmtpdCJdO2cub24oImJlZm9yZVJlYWR5IixmdW5jdGlvbigpe2lmKG4uYWRkRXZlbnRMaXN0ZW5lcil7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1mdW5jdGlvbihiKXtjLnRyYW5zaXRpb25lbmQ9Yi50eXBlO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2Via2l0VHJhbnNpdGlvbkVuZCIsZSwhMSk7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixlLCExKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm90cmFuc2l0aW9uZW5kIixlLCExKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm9UcmFuc2l0aW9uRW5kIixlLCExKX07Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDt6LWluZGV4Oi0xO3RyYW5zaXRpb246dG9wIDFtcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjp0b3AgMW1zIGVhc2U7LW1vei10cmFuc2l0aW9uOnRvcCAxbXMgZWFzZTstby10cmFuc2l0aW9uOnRvcCAxbXMgZWFzZTsiKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixlLCExKTtiLmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdFRyYW5zaXRpb25FbmQiLGUsITEpO2IuYWRkRXZlbnRMaXN0ZW5lcigib3RyYW5zaXRpb25lbmQiLGUsITEpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigib1RyYW5zaXRpb25FbmQiLGUsITEpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7ZC5kZWxheShmdW5jdGlvbigpe2Iuc3R5bGUudG9wPSIxMDBweCI7ZC5kZWxheShmdW5jdGlvbigpe2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtiPWU9bnVsbDtkLmVhY2goYyxmdW5jdGlvbihiKXt9KX0sMTAwKX0sMCl9fSk7cmV0dXJue3ByZWZpeGVzOntnZXRTdHlsZTpmdW5jdGlvbihjKXtpZighYltjXSl7dmFyIGQ9ayhjKTtpZihkIGluIGgpYltjXT1kO2Vsc2UgZm9yKHZhciBkPWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKSxnPWUubGVuZ3RoO2ctLTspe3ZhciBhPWVbZ10rZDthIGluIGgmJgooYltjXT1hKX19cmV0dXJuIGJbY119LGdldEV2ZW50OmZ1bmN0aW9uKGIpe3JldHVybiBiP2NbYi50b0xvd2VyQ2FzZSgpXTp2b2lkIDB9fX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLWJhc2UiLCJhLXV0aWwiLCJhLWV2ZW50cyIsImEtZXZlbnQtYW5hbHl0aWNzIiwiYS10aW1pbmctYW5hbHl0aWNzIiwicHJ2OmEtZGVjbGFyYXRpdmUtYW5hbHl0aWNzIiwicC1yZWNvcmRlci1zdG9wIikucmVnaXN0ZXIoImEtZGVjbGFyYXRpdmUiLGZ1bmN0aW9uKGQsZyxrLGMsaCxiLGUpe2Z1bmN0aW9uIHAoYSl7dmFyIGI9dChhLmN1cnJlbnRUYXJnZXQpLGY9dChhLnRhcmdldCk7aWYoInN1Ym1pdCI9PT1hLnR5cGUpe3ZhciBsPWYuY2xvc2VzdCgiZm9ybSIpO2wubGVuZ3RoJiYoZj1sKX1pZihsPWIuZGF0YSgiYWN0aW9uIikpbD1sLnNwbGl0KCIgIiksZy5lYWNoKGwsZnVuY3Rpb24obCl7dmFyIGU9cltsXXx8e30sZD1iLmRhdGEobCksaD1hLnR5cGUsZz17JHRhcmdldDpmLCRjdXJyZW50VGFyZ2V0OmIsCnRhcmdldFRhZzpmLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpLHR5cGU6aCxhY3Rpb246bCxkYXRhOmQsJGV2ZW50OmEsJGRlY2xhcmF0aXZlUGFyZW50OmJ9O2w9ImE6ZGVjbGFyYXRpdmU6IitsO2g9bCsiOiIraDtrLnRyaWdnZXIobCxnKTtrLnRyaWdnZXIoaCxnKTtrLmlzTGlzdGVuaW5nKGgpfHxjLmhhbmRsZShhKTtnPSExO2Q/Zz0hIWQuYWxsb3dMaW5rRGVmYXVsdDplJiYoZz0hIWUuYWxsb3dMaW5rRGVmYXVsdCk7ImNsaWNrIiE9PWEudHlwZXx8Zz9lPSExOihlPWYuY2xvc2VzdCgiYSIpLGU9ZS5sZW5ndGgmJigiIyI9PT1lWzBdLmhyZWZ8fGEuY3VycmVudFRhcmdldD09PWVbMF18fGUucGFyZW50KCIuYS1kZWNsYXJhdGl2ZSIpLmxlbmd0aCkpO2UmJmEucHJldmVudERlZmF1bHQoKX0pfXZhciB0PWQuJCxyPXt9O2UoKTt0KGRvY3VtZW50KS5kZWxlZ2F0ZSgiLmEtZGVjbGFyYXRpdmUiLCJibHVyIGNsaWNrIGRibGNsaWNrIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbW91c2Vkb3duIG1vdXNldXAgbW91c2VlbnRlciBtb3VzZWxlYXZlIG1vdXNlbW92ZSBjaGFuZ2Ugc3VibWl0IHRvdWNoc3RhcnQgdG91Y2hlbmQgdG91Y2htb3ZlIHRvdWNoY2FuY2VsIGtleWRvd24ga2V5dXAga2V5cHJlc3MgTVNQb2ludGVyRG93biBwb2ludGVyZG93biBNU1BvaW50ZXJVcCBwb2ludGVydXAgTVNQb2ludGVyTW92ZSBwb2ludGVybW92ZSBNU1BvaW50ZXJDYW5jZWwgcG9pbnRlcmNhbmNlbCBNU1BvaW50ZXJPdmVyIHBvaW50ZXJlbnRlciBNU1BvaW50ZXJPdXQgcG9pbnRlcmxlYXZlIiwKcCkuZGVsZWdhdGUoIi5hLWdlc3R1cmUiLCJ0YXAgc3dpcGUgc3dpcGUtaG9yaXpvbnRhbCBzd2lwZS12ZXJ0aWNhbCBwYW4taG9yaXpvbnRhbCBwYW4tdmVydGljYWwgZG91YmxlVGFwIixwKTtkPWZ1bmN0aW9uKCl7dmFyIGEsZSxmLGw7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMjphPWFyZ3VtZW50c1swXTtsPWFyZ3VtZW50c1sxXTticmVhaztjYXNlIDM6YT1hcmd1bWVudHNbMF07ZT1hcmd1bWVudHNbMV07bD1hcmd1bWVudHNbMl07YnJlYWs7Y2FzZSA0OmE9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLGY9YXJndW1lbnRzWzJdLGw9YXJndW1lbnRzWzNdfWlmKGEpeyJzdHJpbmciPT09dHlwZW9mIGEmJihhPWcudHJpbShhKS5zcGxpdCgiICIpKTt2YXIgZD10aGlzO2cuZWFjaChhLGZ1bmN0aW9uKGEpe3ZhciBoPSJhOmRlY2xhcmF0aXZlOiIrYTtyW2FdPWZ8fHt9O2U/KGU9InN0cmluZyI9PT10eXBlb2YgZT9nLnRyaW0oZSkuc3BsaXQoIiAiKTplLGcuZWFjaChlLApmdW5jdGlvbihmKXtrLm9uLmNhbGwoZCxoKyI6IitmLGwpO2Mubm90aWZ5KGEsZik7Yi5ub3RpZnkoYSxmKX0pKTprLm9uLmNhbGwoZCxoLGwpfSl9fTtkLmNyZWF0ZT1mdW5jdGlvbihhLGIsYyl7dmFyIGw9YS5qcXVlcnkmJmEubGVuZ3RoP2E6dChhKTtpZihsLmxlbmd0aCYmYil7dmFyIGU9bC5kYXRhKCJhY3Rpb24iKTtsLmRhdGEoImFjdGlvbiIsZT9lKyIgIitiOmIpLmRhdGEoYixjP2M6e30pO2wuYWRkQ2xhc3MoImEtZGVjbGFyYXRpdmUiKX1yZXR1cm4gYX07ZC5yZW1vdmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmpxdWVyeSYmYS5sZW5ndGg/YTp0KGEpO2lmKCFjLmxlbmd0aClyZXR1cm4gYTt2YXIgbD1jLmRhdGEoImFjdGlvbiIpO2lmKCFsKXJldHVybiBhO3ZhciBlPWwuc3BsaXQoIiAiKTtiPyhiPWIuc3BsaXQoIiAiKSxnLmVhY2goYixmdW5jdGlvbihhKXt2YXIgYj1nLmluZGV4T2ZBcnJheShlLGEpOzA8PWImJihlLnNwbGljZShiLDEpLGMuZGF0YShhLG51bGwpKX0pKToKKGcuZWFjaChlLGZ1bmN0aW9uKGEpe2MuZGF0YShhLG51bGwpfSksZT1bXSk7ZS5sZW5ndGg/Yy5kYXRhKCJhY3Rpb24iLGUuam9pbigiICIpKTpjLmRhdGEoImFjdGlvbiIsbnVsbCkucmVtb3ZlQ2xhc3MoImEtZGVjbGFyYXRpdmUiKTtyZXR1cm4gYX07aC5zdG9wV2lkZ2V0TG9nZ2luZygiZGVjbGFyYXRpdmUiKTtyZXR1cm57ZGVjbGFyYXRpdmU6ZH19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLXV0aWwiLCJqUXVlcnkiLCJhLWRlY2xhcmF0aXZlIikucmVnaXN0ZXIoImEtZHJhZ2dhYmxlIixmdW5jdGlvbihkLGcsayl7dmFyIGMsaD17X21heFpJbmRleDowLF9pc0luaXQ6ITEsX2RyYWdnYWJsZXM6W10sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9pc0luaXR8fCh0aGlzLl9pc0luaXQ9ITAsdGhpcy5fbWF4WkluZGV4PTk3NSl9LGNyZWF0ZTpmdW5jdGlvbihiKXt0aGlzLl9pbml0KCk7Yi5femltSW5kZXh8fChiLl96aW1JbmRleD05NzUsdGhpcy5fbWF4WkluZGV4Kz0xLHRoaXMuX2RyYWdnYWJsZXMucHVzaChiKSk7CnRoaXMuYWNxdWlyZUZvY3VzKGIpfSxhY3F1aXJlRm9jdXM6ZnVuY3Rpb24oYil7Yi5jc3MoInpJbmRleCIsdGhpcy5fbWF4WkluZGV4KTtjLmNzcygiekluZGV4Iix0aGlzLl9tYXhaSW5kZXgtMSk7Zm9yKHZhciBhPTA7YTx0aGlzLl9kcmFnZ2FibGVzLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuX2RyYWdnYWJsZXNbYV07ZVswXSE9PWJbMF0mJmUuX3ppbUluZGV4PmIuX3ppbUluZGV4JiYoZS5femltSW5kZXgtPWUuX3ppbUluZGV4PnRoaXMuX21heFpJbmRleC0xPzI6MSxlLmNzcygiekluZGV4IixlLl96aW1JbmRleCkpfWIuX3ppbUluZGV4PXRoaXMuX21heFpJbmRleH19LGI9ZnVuY3Rpb24oYil7dmFyIGE9Yi4kZXZlbnQ7ZC5jb250YWlucygidG91Y2hzdGFydCB0b3VjaGVuZCB0b3VjaG1vdmUiLGIudHlwZSkmJihhPWEub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKTtyZXR1cm57eDphLmNsaWVudFgseTphLmNsaWVudFl9fSxlPWZ1bmN0aW9uKGMpe3ZhciBhPWMuZGF0YS4kZHJhZ2dhYmxlLAplPWEuZGF0YSgiYS1kcmFnZ2FibGVzIiksZj1iKGMpO2UuaXNNb3VzZURvd24mJihhLmNzcyh7bGVmdDpmLngtZS5jbGlja09mZnNldC54LHRvcDpmLnktZS5jbGlja09mZnNldC55fSksYy4kZXZlbnQucHJldmVudERlZmF1bHQoKSl9LHA9ZnVuY3Rpb24oZSl7dmFyIGE9ZS4kZXZlbnQudGFyZ2V0fHxlLiRldmVudC5zcmNFbGVtZW50LGQ9ZS5kYXRhLiRkcmFnZ2FibGUsZj1kLmRhdGEoImEtZHJhZ2dhYmxlcyIpO2guYWNxdWlyZUZvY3VzKGQpO2E9ZyhhKS5jbG9zZXN0KGYuJGhhbmRsZSxkKTtmLmlzTW91c2VEb3duPTA8YS5sZW5ndGg7Zi5pc01vdXNlRG93biYmKGMmJmMucmVtb3ZlQ2xhc3MoImFvay1oaWRkZW4iKSxhPWIoZSksZi5jbGlja09mZnNldD17eDphLngtcGFyc2VGbG9hdChkLmNzcygibGVmdCIpKSx5OmEueS1wYXJzZUZsb2F0KGQuY3NzKCJ0b3AiKSl9LGQuZGF0YSgiYS1kcmFnZ2FibGVzIixmKSxjLmRhdGEoImEtZHJhZ2dhYmxlcyIsZiksZS4kZXZlbnQucHJldmVudERlZmF1bHQoKSl9LAp0PWZ1bmN0aW9uKGIpe2I9Yi5kYXRhLiRkcmFnZ2FibGU7dmFyIGE9Yi5kYXRhKCJhLWRyYWdnYWJsZXMiKTthLmlzTW91c2VEb3duPSExO2IuZGF0YSgiYS1kcmFnZ2FibGVzIixhKTtjJiZjLmFkZENsYXNzKCJhb2staGlkZGVuIil9O3JldHVybntkcmFnZ2FibGU6ZnVuY3Rpb24oYixhKXtiPWIuanF1ZXJ5P2I6ZyhiKTthPXtpc01vdXNlRG93bjohMSwkZHJhZ2dhYmxlOmIsJGhhbmRsZTphJiZhLmhhbmRsZT9hLmhhbmRsZTpifTthLiRoYW5kbGU9YS4kaGFuZGxlLmpxdWVyeT9hLiRoYW5kbGU6ZyhhLmhhbmRsZSk7YS4kaGFuZGxlLmNzcygiY3Vyc29yIiwibW92ZSIpO2N8fChjPWcoIlx4M2NkaXZceDNlIix7aWQ6ImEtZHJhZ2dhYmxlcy1tb3VzZWRvd24tbGF5ZXIiLCJjbGFzcyI6ImFvay1oaWRkZW4ifSkuYXBwZW5kVG8oImJvZHkiKSxrLmRlY2xhcmF0aXZlLmNyZWF0ZShjLCJhLWRyYWdnYWJsZXMiLGEpKTtoLmNyZWF0ZShhLiRkcmFnZ2FibGUpO2suZGVjbGFyYXRpdmUuY3JlYXRlKGEuJGRyYWdnYWJsZSwKImEtZHJhZ2dhYmxlcyIsYSk7ay5kZWNsYXJhdGl2ZSgiYS1kcmFnZ2FibGVzIixbIm1vdXNlZG93biIsInRvdWNoc3RhcnQiXSxwKTtrLmRlY2xhcmF0aXZlKCJhLWRyYWdnYWJsZXMiLFsibW91c2V1cCIsInRvdWNoZW5kIl0sdCk7ay5kZWNsYXJhdGl2ZSgiYS1kcmFnZ2FibGVzIixbIm1vdXNlbW92ZSIsInRvdWNobW92ZSJdLGUpfX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJhLWJhc2UiLCJhLXV0aWwiLCJhLWV2ZW50cyIsImEtZGVjbGFyYXRpdmUiLCJhLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLXN0YXRlIixmdW5jdGlvbihkLGcsayxjLGgpe2Z1bmN0aW9uIGIoYSxiLGMsZSl7dmFyIGQ9IShhIGluIHIpO2lmKG51bGw9PT1ifHx0LmlzQXJyYXkoYil8fHQuaXNQbGFpbk9iamVjdChiKSl7dmFyIHA9Zy5jb3B5KHJbYV0pO3AmJmImJiFlJiYodC5pc0FycmF5KHApfHx0LmlzUGxhaW5PYmplY3QocCkpP2cuZXh0ZW5kKHJbYV0sYik6clthXT1nLmNvcHkoYik7Yj1nLmRpZmYocCwKclthXSk7ZT1nLmNvcHkoclthXSk7Y3x8ay50cmlnZ2VyKCJhOnN0YXRlOnVwZGF0ZToiK2EsZSxiLHApO2QmJm0uZGVjbGFyZShoLmNvbnN0YW50cy5QQUdFU1RBVEVfTE9BREVEX01PRFVMRV9QUkVGSVgrYSxlKTtyZXR1cm4gZX1tLmVycm9yKCJJbnZhbGlkIHZhbHVlIHBhc3NlZCB0byBBLnN0YXRlIHdpdGggYSBuYW1lc3BhY2Ugb2YgIithKyIuICBWYWx1ZTogIitiLCJBLnN0YXRlIiwidXBkYXRlTmFtZXNwYWNlIil9ZnVuY3Rpb24gZShhLGIsYyl7aWYoMT09PWIubGVuZ3RoKXJldHVybiBhW2Iuc2hpZnQoKV09YyxhO2FbYi5zaGlmdCgpXT1lKHt9LGIsYyk7cmV0dXJuIGF9ZnVuY3Rpb24gcCgpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksYz0wLGU9YS5sZW5ndGg7YzxlO2MrKylpZighdC5kYXRhKGFbY10sImEtZXZhbCIpKXt2YXIgbD10KGFbY10pLGQ9bC5hdHRyKCJkYXRhLWEtc3RhdGUiKTtpZihkJiYoZD1nLnBhcnNlSlNPTihkKSwKZC5rZXkpKXt2YXIgaDt0cnl7aD1nLnBhcnNlSlNPTihsLmh0bWwoKSl9Y2F0Y2goayl7bS5sb2dFcnJvcihrLCJTdGF0ZSBwYXJzaW5nIGZhaWxlZCBmb3Igc3RhdGUgIitkLmtleSwiRVJST1IiKTtjb250aW51ZX10LmRhdGEoYVtjXSwiYS1ldmFsIiwhMCk7KGw9cltkLmtleV0pJiZnLmV4dGVuZChoLGwpO2IoZC5rZXksaCl9fX12YXIgdD1kLiQscj17fTtjLmRlY2xhcmF0aXZlKCJhLXN0YXRlIixmdW5jdGlvbihhKXt2YXIgYz1hLiR0YXJnZXQsZj1hLmRhdGEua2V5LGw9YS5kYXRhW2EudHlwZV07bHx8ay5ldmVudHMuZGVmYXVsdHNbYS50YXJnZXRUYWddIT09YS50eXBlfHwobD1jLmF0dHIoIm5hbWUiKSk7bCYmZiYmKGMuaXMoInNlbGVjdCIpJiYoYz1jLmZpbmQoIjpzZWxlY3RlZCIpKSx2b2lkIDAhPT10eXBlb2YgYy52YWwoKSYmInN0cmluZyI9PT10eXBlb2YgbCYmKGE9Yy52YWwoKSxjLmlzKCJpbnB1dFt0eXBlXHgzZGNoZWNrYm94XSIpJiYhYy5wcm9wKCJjaGVja2VkIikmJgooYT1udWxsKSxsPWUoe30sbC5zcGxpdCgiLiIpLGEpKSxiKGYsbCkpfSk7ZD1mdW5jdGlvbihhLGMsZSl7cmV0dXJuIHZvaWQgMD09PWM/Zy5jb3B5KHJbYV0pOmIoYSxjLCEhZSl9O2QuYmluZD1mdW5jdGlvbihhLGIpe2sub24oImE6c3RhdGU6dXBkYXRlOiIrYSxiKX07ZC5yZXBsYWNlPWZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gYihhLGMsISFlLCEwKX07ay5vbigiYmVmb3JlUmVhZHkiLHApO2QucGFyc2U9cDtyZXR1cm57c3RhdGU6ZH19KTsidXNlIHN0cmljdCI7bS53aGVuKCJwcnY6YS1ndWFyZCIsImEtYmFzZSIsImEtdXRpbCIsImEtZXZlbnRzIiwiYS1kZWNsYXJhdGl2ZSIsImEtc3RhdGUiKS5yZWdpc3RlcigiYS1hamF4IixmdW5jdGlvbihkLGcsayxjLGgsYil7ZnVuY3Rpb24gZShhLGIpe2lmKCFhKXJldHVybiIiO3ZhciBjPSJzdHJpbmciPT09dHlwZW9mIGE7aWYoInN0cmluZyI9PT1iKXJldHVybiBjP2E6IiI7aWYoImpzb24iPT09Yil7aWYoYylyZXR1cm4gYTt0cnl7cmV0dXJuIEpTT04mJgpKU09OLnN0cmluZ2lmeT9KU09OLnN0cmluZ2lmeShhKToiIn1jYXRjaChlKXttLmxvZ0Vycm9yKGUsIkFKQVggUE9TVCBmYWlsZWQgdG8gY29udmVydCBKU09OIG9iamVjdCB0byBzdHJpbmciKX1yZXR1cm4iIn1yZXR1cm4gYz8iIjp0LnBhcmFtKGEpfWZ1bmN0aW9uIHAoYixjKXtiJiYwIT09Yi5sZW5ndGgmJigic3RyaW5nIj09PXR5cGVvZiBiJiYiIj09PWsudHJpbShiKT9jJiZjKGIpOihiWzBdaW5zdGFuY2VvZiBBcnJheXx8KGI9W2JdKSxrLmVhY2goYixmdW5jdGlvbihlKXt2YXIgZj1hW2VbMF1dO2Y/Zi5hcHBseShuLGUpOigoZj1jKXx8bS5lcnJvcigiVGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhlIHN0cmVhbWluZyBhamF4IGNvbW1hbmQ6ICIrYlswXSwiQS5hamF4IiwiY2h1bmtIYW5kbGVyIiksZihlKSl9KSkpfXZhciB0PWcuJCxyPWZ1bmN0aW9uKCl7bi5YTUxIdHRwUmVxdWVzdHx8KG4uWE1MSHR0cFJlcXVlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9KTsKdmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7MDxiLmxlbmd0aD9iLnBvcCgpLnNlbmQoKTpjLS19dmFyIGI9W10sYz0wLGU9MCxmPTA7cmV0dXJue2FkZDpmdW5jdGlvbihhKXs0PmM/KGEuc2VuZCgpLGMrKyk6KGIucHVzaChhKSxlKyssYi5sZW5ndGg+ZiYmKGY9Yi5sZW5ndGgpLChhPW4udWUpJiZhLmNvdW50JiYoYS5jb3VudCgiYXVpOmFqYXg6cXVldWVkIixlKSxhLmNvdW50KCJhdWk6YWpheDptYXhRdWV1ZWQiLGYpKSl9LGNvbXBsZXRlOmEsYWJvcnQ6ZnVuY3Rpb24oYyl7ay5lYWNoKGIsZnVuY3Rpb24oYSxlKXtpZihhPT09YylyZXR1cm4gYi5zcGxpY2UoZSwxKSxrLmJyZWFrZXJ9KTthKCl9fX0oKSxiPWZ1bmN0aW9uKCl7fSxlPWZ1bmN0aW9uKGIpe3ZhciBlPWIuaHR0cCxmPSExLGQ9ITE7c3dpdGNoKGUucmVhZHlTdGF0ZSl7Y2FzZSA0OmQ9ITA7YnJlYWs7Y2FzZSAzOmY9ITB9dmFyIGg9MjAwPT09ZS5zdGF0dXN8fDMwND09PWUuc3RhdHVzLGc9Yi5yZXNwb25zZVBvc2l0aW9uOwppZihmfHxkJiZoKXt2YXIgcD1lLnJlc3BvbnNlVGV4dDtpZihnPHAubGVuZ3RoKXt2YXIgZz1wLnN1YnN0cmluZyhnLHAubGVuZ3RoKSxwPWcuc3BsaXQoIlx4MjZceDI2XHgyNiIpLHE9Zy5sYXN0SW5kZXhPZigiXHgyNlx4MjZceDI2Iik7aWYoLTE9PT1xJiZmKXJldHVybjtxPGcubGVuZ3RoLTMmJmYmJnAucG9wKCk7ay5lYWNoKHAsZnVuY3Rpb24oYSxjKXt2YXIgZTtpZigiIiE9PWsudHJpbShhKSl0cnl7ZT1rLnBhcnNlSlNPTihhKX1jYXRjaChmKXttLmxvZ0Vycm9yKGYsIkludmFsaWQgc3RyZWFtaW5nIGFqYXggSlNPTiByZXNwb25zZTogIithKX1lbHNlIGU9YTtiLmNhbGxiYWNrcy5jaHVuayhlKX0pO2IucmVzcG9uc2VQb3NpdGlvbis9cX19ZCYmKGNsZWFySW50ZXJ2YWwoYi5wb2xsVGltZXIpLGNsZWFyVGltZW91dChiLnRpbWVvdXRUaW1lciksYS5jb21wbGV0ZSgpLGg/Yi5jYWxsYmFja3Muc3VjY2VzcyhudWxsLGUuc3RhdHVzVGV4dCxiKTpiLmNhbGxiYWNrcy5mYWlsdXJlKGIsCmUuc3RhdHVzVGV4dCxlLnN0YXR1c1RleHQpLGMudHJpZ2dlcigiYTpwYWdlVXBkYXRlIiksYy50cmlnZ2VyKCJhOmFqYXg6Y29tcGxldGUiKSl9LGY9ZnVuY3Rpb24oYil7dmFyIGU9Yi5odHRwO2lmKDQ9PT1lLnJlYWR5U3RhdGUpe2NsZWFySW50ZXJ2YWwoYi5wb2xsVGltZXIpO2NsZWFyVGltZW91dChiLnRpbWVvdXRUaW1lcik7YS5jb21wbGV0ZSgpO3ZhciBmPWUucmVzcG9uc2VUZXh0O3RyeXt2YXIgZD1rLnBhcnNlSlNPTihmKTtkJiYoZj1kKX1jYXRjaChoKXt9MjAwIT09ZS5zdGF0dXMmJjMwNCE9PWUuc3RhdHVzP2IuY2FsbGJhY2tzLmZhaWx1cmUoYixlLnN0YXR1c1RleHQsZS5zdGF0dXNUZXh0KTpiLmNhbGxiYWNrcy5zdWNjZXNzKGYsZS5zdGF0dXNUZXh0LGIpO2MudHJpZ2dlcigiYTphamF4OmNvbXBsZXRlIil9fTtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGIpezQ+Yi5odHRwLnJlYWR5U3RhdGUmJihjbGVhckludGVydmFsKGIucG9sbFRpbWVyKSxiLmNhbGxiYWNrcy5mYWlsdXJlKGIsCiJSZXF1ZXN0IFRpbWVvdXQiLCJSZXF1ZXN0IFRpbWVvdXQiKSxhLmNvbXBsZXRlKCkpfWZ1bmN0aW9uIGQoYSxiLGMpe2M9Y3x8e307Yz1rLmV4dGVuZCh7fSxnLmFsbCxnW2JdLGMpO2suZWFjaChjLGZ1bmN0aW9uKGIsYyl7KGJ8fCIiPT09YikmJmEuc2V0UmVxdWVzdEhlYWRlcihjLGIpfSk7cmV0dXJuIGF9ZnVuY3Rpb24gaChiLGMsZSxmLGcsayxwLHEseCxyKXt2YXIgdD1iLmh0dHA7dC5vcGVuKGMsZSk7ZCh0LGMseCk7Yi50aW1lb3V0PWY7Yi5jYWxsYmFja3MuY2h1bms9Z3x8Yi5jYWxsYmFja3MuY2h1bms7Yi5jYWxsYmFja3Muc3VjY2Vzcz1rfHxiLmNhbGxiYWNrcy5zdWNjZXNzO2IuY2FsbGJhY2tzLmZhaWx1cmU9cHx8Yi5jYWxsYmFja3MuZmFpbHVyZTtiLmNhbGxiYWNrcy5hYm9ydD1xfHxiLmNhbGxiYWNrcy5hYm9ydDtyJiYodC53aXRoQ3JlZGVudGlhbHM9ITApO2EuYWRkKGIpO3JldHVybnthYm9ydDpmdW5jdGlvbigpe2IuYWJvcnQoKX19fXZhciBnPXthbGw6eyJYLVJlcXVlc3RlZC1XaXRoIjoiWE1MSHR0cFJlcXVlc3QifSwKZ2V0OntBY2NlcHQ6InRleHQvaHRtbCwqLyoifSxwb3N0OntBY2NlcHQ6InRleHQvaHRtbCwqLyoiLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifX0scD1mdW5jdGlvbigpe3ZhciBhPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLnBvbGxUaW1lcj1udWxsO3RoaXMuaHR0cD1hO3RoaXMucmVzcG9uc2VQb3NpdGlvbj0wO3RoaXMuYnVmZmVyPSIiO3RoaXMuY2FsbGJhY2tzPXtzdWNjZXNzOmIsZmFpbHVyZTpiLGNodW5rOmIsYWJvcnQ6Yn19O3AucHJvdG90eXBlPXtzZW5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmh0dHAuc2VuZChhLnBhcmFtcyk7YS5wb2xsVGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtpZigyPD1hLmh0dHAucmVhZHlTdGF0ZSYmInVua25vd24iIT09dHlwZW9mIGEuaHR0cC5yZXNwb25zZVRleHQpe3ZhciBiPWEuaHR0cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIiksYj1iP2IudG9Mb3dlckNhc2UoKToKIiI7KC0xIT09Yi5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uLWFtYXpvbnVpLXN0cmVhbWluZyIpfHwtMSE9PWIuaW5kZXhPZigiYXBwbGljYXRpb24vYW1hem9udWktc3RyZWFtaW5nLWpzb24iKT9lOmYpKGEpfX0sMjUpO2EudGltZW91dD0idW5kZWZpbmVkIj09PXR5cGVvZiBhLnRpbWVvdXQ/MkU0OmEudGltZW91dDthLnRpbWVvdXRUaW1lcj1rLmRlbGF5KGMsYS50aW1lb3V0LGEpfSxnZXQ6ZnVuY3Rpb24oYSxiLGMsZSxmLGwsZCxnLGspe2lmKGIpe3ZhciBwPWEuaW5kZXhPZigiPyIpLHE9YS5jaGFyQXQoYS5sZW5ndGgtMSk7LTE8cD8iPyIhPT1xJiYiXHgyNiIhPT1xJiYoYSs9Ilx4MjYiKTphKz0iPyI7YSs9Yn1yZXR1cm4gaCh0aGlzLCJnZXQiLGEsYyxlLGYsbCxkLGcsayl9LGFib3J0OmZ1bmN0aW9uKCl7dGhpcy5odHRwJiZ0aGlzLmh0dHAuYWJvcnQoKTtjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpO2EuYWJvcnQodGhpcyk7CnRoaXMuY2FsbGJhY2tzLmFib3J0KHRoaXMpfSxwb3N0OmZ1bmN0aW9uKGEsYixjLGUsZixsLGQsZyxrKXt0aGlzLnBhcmFtcz1iO3JldHVybiBoKHRoaXMsInBvc3QiLGEsYyxlLGYsbCxkLGcsayl9fTtyZXR1cm4gcH0oKX0oKSxhPXt1cGRhdGU6ZnVuY3Rpb24oYSxiLGMpe3QoYikuaHRtbChjKX0sYXBwZW5kOmZ1bmN0aW9uKGEsYixjKXthPXQoYik7YS5odG1sKGEuaHRtbCgpK2MpfSxwcmVwZW5kOmZ1bmN0aW9uKGEsYixjKXthPXQoYik7YS5odG1sKGMrYS5odG1sKCkpfSxzdGF0ZTpmdW5jdGlvbihhLGMsZSl7Yi5zdGF0ZShjLGUpfSxzY3JpcHQ6ZnVuY3Rpb24oYSxiKXtldmFsKGIpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7dmFyIGU7ZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Yy50cmlnZ2VyLmFwcGx5KHZvaWQgMCxlKX19LHE9eyJhLWFqYXgtdXBkYXRlIjpmdW5jdGlvbihhKXt2YXIgYj1uZXcgcixjPWZ1bmN0aW9uKCl7dmFyIGE9bi51ZTsKYSYmYS50YWcmJihhLnRhZygiYXVpIiksYS50YWcoImF1aTphamF4IikpfSxlPWEuYWJvcnQsZj10KGEuaW5kaWNhdG9yKTtmLnNob3coKTt2YXIgZD0ic3RyaW5nIj09PXR5cGVvZiBhLm1ldGhvZCYmInBvc3QiPT09YS5tZXRob2QudG9Mb3dlckNhc2UoKT8icG9zdCI6ImdldCI7ImdldCI9PT1kJiYhMT09PWEuY2FjaGUmJihhLnBhcmFtcys9WyIiPT09YS5wYXJhbXM/IiI6Ilx4MjYiLCJfXHgzZCIsay5ub3coKV0uam9pbigiIikpO3JldHVybiBiW2RdKGEudXJsLGEucGFyYW1zLGEudGltZW91dCxmdW5jdGlvbihiKXtjKCk7cChiLGEuY2h1bmspfSxmdW5jdGlvbigpe2YuaGlkZSgpO2MoKTthLnN1Y2Nlc3MmJmEuc3VjY2Vzcy5hcHBseShuLGFyZ3VtZW50cyl9LGZ1bmN0aW9uKCl7Zi5oaWRlKCk7YygpO2EuZmFpbHVyZSYmYS5mYWlsdXJlLmFwcGx5KG4sYXJndW1lbnRzKX0sZSxhLmhlYWRlcnMsYS53aXRoQ3JlZGVudGlhbHMpfX07aC5kZWNsYXJhdGl2ZSgiYS1hamF4LXVwZGF0ZSIsCmZ1bmN0aW9uKGEpe3ZhciBiPWEuJHRhcmdldCxmPWEuYWN0aW9uLGQ9YS5kYXRhO2lmKGR8fGMuZXZlbnRzLmRlZmF1bHRzW2EudGFyZ2V0VGFnXT09PWEudHlwZSlpZigib2JqZWN0IiE9PXR5cGVvZiBkfHxkW2EudHlwZV0pe3ZhciBkPWR8fHt9LGg9ZC51cmx8fGIuYXR0cigiaHJlZiIpfHxiLmF0dHIoImFjdGlvbiIpLGc9ZShkLnBhcmFtcyxkLnBhcmFtc0Zvcm1hdCksaz1iLmF0dHIoIm1ldGhvZCIpfHxkLm1ldGhvZCxwPWQuaW5kaWNhdG9yLGQ9ZC50aW1lb3V0O2h8fG0uZXJyb3IoIk5vIGFqYXggdXJsIHByb3ZpZGVkLiIsIkEuYWpheCIsImRlY2xhcmF0aXZlSGFuZGxlciIpOyJmb3JtIj09PWEudGFyZ2V0VGFnJiZhLnR5cGU9PT1jLmV2ZW50cy5kZWZhdWx0cy5mb3JtJiYoYj1iLnNlcmlhbGl6ZSgpLGcrPWIpO2EuJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIHFbZl0oe3VybDpoLHBhcmFtczpnLG1ldGhvZDprLGluZGljYXRvcjpwLG9wZXJhdGlvbjpmLHRpbWVvdXQ6ZH0pfX0pOwp2YXIgZj1mdW5jdGlvbihhLGIpe2I9Ynx8e307dmFyIGM9Yi5oZWFkZXJzfHx7fTt2b2lkIDAhPT1iLmFjY2VwdHMmJihjLkFjY2VwdD1iLmFjY2VwdHMpO3ZvaWQgMCE9PWIuY29udGVudFR5cGUmJihjWyJDb250ZW50LVR5cGUiXT1iLmNvbnRlbnRUeXBlKTt2YXIgZj1lKGIucGFyYW1zLGIucGFyYW1zRm9ybWF0KTtyZXR1cm4gcVsiYS1hamF4LXVwZGF0ZSJdKGQub2JqKHRoaXMse3VybDphLGNhY2hlOmIuY2FjaGUscGFyYW1zOmYsbWV0aG9kOmIubWV0aG9kLGNodW5rOmIuY2h1bmssc3VjY2VzczpiLnN1Y2Nlc3MsZmFpbHVyZTpiLmZhaWx1cmV8fGIuZXJyb3IsYWJvcnQ6Yi5hYm9ydCxpbmRpY2F0b3I6Yi5pbmRpY2F0b3IsdGltZW91dDpiLnRpbWVvdXQsaGVhZGVyczpjLHdpdGhDcmVkZW50aWFsczohIWIud2l0aENyZWRlbnRpYWxzfSkpfTtyZXR1cm57YWpheDpmLGdldDpmdW5jdGlvbihhLGIpe2I9Ynx8e307Yi5tZXRob2Q9ImdldCI7cmV0dXJuIGYuY2FsbCh0aGlzLGEsCmIpfSxwb3N0OmZ1bmN0aW9uKGEsYil7Yj1ifHx7fTtiLm1ldGhvZD0icG9zdCI7cmV0dXJuIGYuY2FsbCh0aGlzLGEsYil9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtYmFzZSIsImEtdXRpbCIsInAtZGV0ZWN0IiwiYS1wcmVmaXgiKS5yZWdpc3RlcigiYS1hbmltYXRlIixmdW5jdGlvbihkLGcsayxjKXtmdW5jdGlvbiBoKGEsYixlKXthPWEuanF1ZXJ5P2FbMF06YTtiPWMucHJlZml4ZXMuZ2V0U3R5bGUoYik7YS5zdHlsZVtiXT1lfWZ1bmN0aW9uIGIoYSl7dmFyIGI9IiIsYz1rLmNhcGFiaWxpdGllcy50cmFuc2Zvcm0zZDt2b2lkIDAhPT1hLnRvcCYmdm9pZCAwIT09YS5sZWZ0PyhiPSJ0cmFuc2xhdGUiLGMmJihiKz0iM2QiKSxiKz0iKCIrYS5sZWZ0KyIsICIrYS50b3AsYyYmKGIrPSIsIDAiKSxiKz0iKSIpOih2b2lkIDAhPT1hLnRvcD9iPSJ0cmFuc2xhdGVZKCIrYS50b3ArIikiOnZvaWQgMCE9PWEubGVmdCYmKGI9InRyYW5zbGF0ZVgoIithLmxlZnQrIikiKSxjJiYoYis9CiIgdHJhbnNsYXRlWigwKSIpKTt2b2lkIDAhPT1hLnNjYWxlJiYoYis9IiBzY2FsZSgiK2Euc2NhbGUrIikiKTtyZXR1cm4gYn1mdW5jdGlvbiBlKGEpe3ZhciBiPXt9LGM9ITE7Zy5lYWNoKHQsZnVuY3Rpb24oZSl7ZSBpbiBhJiYoYz0hMCxiW2VdPWFbZV0sZGVsZXRlIGFbZV0pfSk7cmV0dXJuIGM/YjpudWxsfWZ1bmN0aW9uIHAoYSxiLGMpe2suY2FwYWJpbGl0aWVzLnRyYW5zZm9ybT8oInN0cmluZyI9PT10eXBlb2YgYyYmKGM9cGFyc2VJbnQoYywxMCkpLGcuaXNGaW5pdGVOdW1iZXIoYyl8fChjPTApLGE9cGFyc2VJbnQoYS5jc3MoYiksMTApLGcuaXNGaW5pdGVOdW1iZXIoYSl8fChhPTApLGM9Yy1hKyJweCIpOmcuaXNGaW5pdGVOdW1iZXIoYykmJihjKz0icHgiKTtyZXR1cm4gY312YXIgdD1bInRvcCIsImxlZnQiLCJzY2FsZSJdO2Q9e2FuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZSxkKXthLl9hfHwoYS5fYT0wKTthLl9hKys7dmFyIGg9ZnVuY3Rpb24oKXthLl9hLS07ZCYmZCgpfTsKYS5xdWV1ZSgiZngiLFtmdW5jdGlvbigpe2EuYW5pbWF0ZShiLHtkdXJhdGlvbjpjLGVhc2luZzoibGluZWFyIj09PWU/ZToic3dpbmciLGNvbXBsZXRlOmgscXVldWU6ITF9KX1dKX0sZmFkZUluOmZ1bmN0aW9uKGEsYixjLGUpe2lmKGEuaGFzQ2xhc3MoImFvay1oaWRkZW4iKXx8YS5oYXNDbGFzcygiYS1oaWRkZW4iKSlhLmNzcygiZGlzcGxheSIsIm5vbmUiKSxhLnJlbW92ZUNsYXNzKCJhb2staGlkZGVuIGEtaGlkZGVuIik7YS5mYWRlSW4oe2R1cmF0aW9uOmIsZWFzaW5nOiJsaW5lYXIiPT09Yz9jOiJzd2luZyIsY29tcGxldGU6ZSxxdWV1ZTohMX0pfSxmYWRlT3V0OmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPWEuY3NzKCJvcGFjaXR5Iik7YS5mYWRlT3V0KHtkdXJhdGlvbjpiLGVhc2luZzoibGluZWFyIj09PWM/Yzoic3dpbmciLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Ljk1PitkJiZhLmNzcygib3BhY2l0eSIsZCk7ZSYmZSgpfSxxdWV1ZTohMX0pfSxmYWRlVG9nZ2xlOmZ1bmN0aW9uKGEsCmIsYyxlKXthLmZhZGVUb2dnbGUoe2R1cmF0aW9uOmIsZWFzaW5nOiJsaW5lYXIiPT09Yz9jOiJzd2luZyIsY29tcGxldGU6ZSxxdWV1ZTohMX0pfSxzbGlkZVVwOmZ1bmN0aW9uKGEsYixjLGUpe2Euc2xpZGVVcCh7ZHVyYXRpb246YixlYXNpbmc6ImxpbmVhciI9PT1jP2M6InN3aW5nIixjb21wbGV0ZTplLHF1ZXVlOiExfSl9LHNsaWRlRG93bjpmdW5jdGlvbihhLGIsYyxlKXthLnNsaWRlRG93bih7ZHVyYXRpb246YixlYXNpbmc6ImxpbmVhciI9PT1jP2M6InN3aW5nIixjb21wbGV0ZTplLHF1ZXVlOiExfSl9LHNsaWRlVG9nZ2xlOmZ1bmN0aW9uKGEsYixjLGUpe2Euc2xpZGVUb2dnbGUoe2R1cmF0aW9uOmIsZWFzaW5nOiJsaW5lYXIiPT09Yz9jOiJzd2luZyIsY29tcGxldGU6ZSxxdWV1ZTohMX0pfSxpc0FuaW1hdGVkOmZ1bmN0aW9uKGEpe2E9YS5qcXVlcnk/YVswXTphO3JldHVybiBhLl9hJiYwPGEuX2F9fTt2YXIgcj17YW5pbWF0ZTpmdW5jdGlvbihhLGMsZixkLHQpe3ZhciByPQphWzBdO2M9Zy5jb3B5KGMpO2Y9dm9pZCAwPT09Zj8yNTA6ZjtkPWR8fCJsaW5lYXIiO3ZvaWQgMCE9PWMudG9wJiYoYy50b3A9cChhLCJ0b3AiLGMudG9wKSk7dm9pZCAwIT09Yy5sZWZ0JiYoYy5sZWZ0PXAoYSwibGVmdCIsYy5sZWZ0KSk7aChhLCJ0cmFuc2l0aW9uIiw0PmY/ImFsbCAwbXMiOiJhbGwgIitmKyJtcyAiK2QpO2lmKDQ8Zil7dm9pZCAwPT09ci5fYSYmKHIuX2E9MCk7ci5fYSsrO3ZhciBuPWZ1bmN0aW9uKCl7ci5fYS0tO3IuX2F8fGgoYSwidHJhbnNpdGlvbiIsIiIpO3QmJnQoKX07Zy5kZWxheShmdW5jdGlvbigpe2cuZGVsYXkobixmKX0sMCl9ay5jYXBhYmlsaXRpZXMudHJhbnNmb3JtJiYoZD1lKGMpKSYmaChhLCJ0cmFuc2Zvcm0iLGIoe3RvcDpkLnRvcCxsZWZ0OmQubGVmdCxzY2FsZTpkLnNjYWxlfSkpO2cub2JqZWN0SXNFbXB0eShjKXx8YS5jc3MoYyk7ND49ZiYmdCYmZy5kZWxheSh0LDApfSxmYWRlSW46ZnVuY3Rpb24oYSxiLGMsZSl7aWYoIm5vbmUiPT09CmEuY3NzKCJkaXNwbGF5Iil8fC4wNT4rYS5jc3MoIm9wYWNpdHkiKSl7dmFyIGQ9YS5jc3MoIm9wYWNpdHkiKXx8MTtpZighZHx8LjA1PitkKWQ9MTthLmNzcygib3BhY2l0eSIsIjAiKS5yZW1vdmVDbGFzcygiYS1oaWRkZW4gYW9rLWhpZGRlbiIpLnNob3coKTt2YXIgaD10aGlzLmFuaW1hdGU7Zy5kZWxheShmdW5jdGlvbigpe2goYSx7b3BhY2l0eTpkfSxiLGMsZnVuY3Rpb24oKXtlJiZlKCl9KX0sMTYpfWVsc2UgZSYmZSgpfSxmYWRlT3V0OmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPWEuY3NzKCJvcGFjaXR5Iik7Im5vbmUiIT09YS5jc3MoImRpc3BsYXkiKSYmLjA1PCtkP3RoaXMuYW5pbWF0ZShhLHtvcGFjaXR5OjB9LGIsYyxmdW5jdGlvbigpe2EuaGlkZSgpLmNzcygib3BhY2l0eSIsZCk7ZSYmZSgpfSk6ZSYmZSgpfSxmYWRlVG9nZ2xlOmZ1bmN0aW9uKGEsYixjLGUpeygibm9uZSI9PT1hLmNzcygiZGlzcGxheSIpfHwuMDU+K2EuY3NzKCJvcGFjaXR5Iik/dGhpcy5mYWRlSW46CnRoaXMuZmFkZU91dCkuY2FsbCh0aGlzLGEsYixjLGUpfSxzbGlkZVVwOmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXRoaXMuYW5pbWF0ZTthLmNzcyh7aGVpZ2h0OmEuaW5uZXJIZWlnaHQoKSxvdmVyZmxvdzoiaGlkZGVuIn0pO2cuZGVsYXkoZnVuY3Rpb24oKXtkKGEse2hlaWdodDowfSxiLGMsZnVuY3Rpb24oKXthLmhpZGUoKTthLmNzcyh7aGVpZ2h0OiIiLG92ZXJmbG93OiIifSk7ZSYmZSgpfSl9LDApfSxzbGlkZURvd246ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGQ9YS5pbm5lckhlaWdodCgpLGg9dGhpcy5hbmltYXRlO2EuY3NzKHtoZWlnaHQ6MCxvdmVyZmxvdzoiaGlkZGVuIn0pO2Euc2hvdygpO2cuZGVsYXkoZnVuY3Rpb24oKXtoKGEse2hlaWdodDpkfSxiLGMsZnVuY3Rpb24oKXtlJiZlKCk7YS5jc3Moe2hlaWdodDoiIixvdmVyZmxvdzoiIn0pfSl9LDApfSxzbGlkZVRvZ2dsZTpmdW5jdGlvbihhLGIsYyxlKXsoYS5pcygiOnZpc2libGUiKT90aGlzLnNsaWRlVXA6dGhpcy5zbGlkZURvd24pLmNhbGwodGhpcywKYSxiLGMsZSl9LGlzQW5pbWF0ZWQ6ZnVuY3Rpb24oYSl7YT1hLmpxdWVyeT9hWzBdOmE7cmV0dXJuIGEuX2EmJjA8YS5fYX19O3JldHVybiBrLmNhcGFiaWxpdGllcy50cmFuc2l0aW9uP3I6ZH0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiKS5yZWdpc3RlcigiYS1pbWFnZS1sYXp5LWxvYWRlciIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKCl7YigiLmEtbGF6eS1sb2FkZWQiKS5lYWNoKGZ1bmN0aW9uKCl7ZS5zZXQoYih0aGlzKSl9KX1mdW5jdGlvbiBjKCl7dmFyIGM9W107YigiLmEtbGF6eS1sb2FkZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGc9Yih0aGlzKTtnLmRhdGEoInNyYyIpJiZoKGcpJiYoZy5sb2FkKGZ1bmN0aW9uKCl7ZC50cmlnZ2VyKCJhOmltYWdlOmxhenlMb2FkZWQiLGcpO2soKX0pLGMucHVzaChnKSxnLnJlbW92ZUNsYXNzKCJhLWxhenktbG9hZGVkIiksZS5yZW1vdmUoZykpfSk7ZC5lYWNoKGMsZnVuY3Rpb24oYil7Yi5hdHRyKCJzcmMiLGIuZGF0YSgic3JjIikpfSl9CmZ1bmN0aW9uIGgoYyl7ZS5nZXQoYyl8fGUuc2V0KGMpO3ZhciBkPWIobiksaD1kLnNjcm9sbFRvcCgpLGQ9bi5pbm5lckhlaWdodD9uLmlubmVySGVpZ2h0OmQuaGVpZ2h0KCksYT1oK2QrNTAwLGg9aC01MDAsZz1lLmdldChjKTtjPWcudG9wO3ZhciBnPWcuaGVpZ2h0LGY9YytnO3JldHVybiBjPj1oJiZjPGF8fGY+aCYmZjw9YXx8Zz5kJiZjPD1oJiZmPj1hfXZhciBiPWQuJCxlPWZ1bmN0aW9uKCl7dmFyIGI9e30sYz0wO3JldHVybntnZXQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGJbYy5kYXRhKCJjYWNoZUtleSIpXX0sc2V0OmZ1bmN0aW9uKGUpe2UuZGF0YSgiY2FjaGVLZXkiKXx8KGUuZGF0YSgiY2FjaGVLZXkiLGMpLGMrKyk7YltlLmRhdGEoImNhY2hlS2V5IildPXt0b3A6ZS5vZmZzZXQoKS50b3AsaGVpZ2h0OmUuaGVpZ2h0KCl9fSxyZW1vdmU6ZnVuY3Rpb24oYyl7Yy5kYXRhKCJjYWNoZUtleSIpJiZkZWxldGUgYltjLmRhdGEoImNhY2hlS2V5IildfX19KCk7aygpO2MoKTtkLm9uKCJzY3JvbGwiLApmdW5jdGlvbigpe2MoKX0pO2Qub24oInNjcm9sbCIsZC5kZWJvdW5jZShmdW5jdGlvbigpe2soKTtjKCl9LDI1MCkpO2Qub24oInJlc2l6ZSIsYyk7ZC5vbigiYTppbWFnZTpsYXp5TG9hZCIsYyk7ZC5vbi5yZWFkeShjKX0pOyJ1c2Ugc3RyaWN0IjttLnJlZ2lzdGVyKCJhLWltYWdlLXVybC1rZXktaGFuZGxlciIsZnVuY3Rpb24oKXtyZXR1cm57Z2VuZXJhdGU6ZnVuY3Rpb24oZCxnKXtyZXR1cm4gZH0scGFyc2U6ZnVuY3Rpb24oZCl7cmV0dXJue3VybDpkfX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiYS1iYXNlIiwiYS11dGlsIiwiYS1ldmVudHMiLCJhLWRlZmVyIiwicC1kZXRlY3QiLCJhLWltYWdlLXVybC1rZXktaGFuZGxlciIpLnJlZ2lzdGVyKCJhLWltYWdlIixmdW5jdGlvbihkLGcsayxjLGgsYil7ZnVuY3Rpb24gZShhKXthPXQoYSk7dmFyIGI9YS5kYXRhKCJhLWR5bmFtaWMtaW1hZ2UiKTtpZihiJiYib2JqZWN0Ij09PXR5cGVvZiBiKXt2YXIgYz1hLmRhdGEoImEtZHluYW1pYy1pbWFnZS1jb250YWluZXIiKTsKInVuZGVmaW5lZCI9PT10eXBlb2YgYyYmKGM9YS5jbG9zZXN0KCIuYS1keW5hbWljLWltYWdlLWNvbnRhaW5lciIpLDA9PT1jLmxlbmd0aCYmKGM9YS5wYXJlbnQoKSksYS5kYXRhKCJhLWR5bmFtaWMtaW1hZ2UtY29udGFpbmVyIixjKSk7dmFyIGU9aC5jYXBhYmlsaXRpZXMuaGlyZXMmJm4uZGV2aWNlUGl4ZWxSYXRpbz9uLmRldmljZVBpeGVsUmF0aW86MSxkPWMud2lkdGgoKSplLGs9Yy5oZWlnaHQoKSplLGw9TnVtYmVyLk1BWF9WQUxVRSxwPU51bWJlci5NQVhfVkFMVUUscj1hLmF0dHIoInNyYyIpfHwiIixxLG09ZC9rO2cuZWFjaChiLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGFyc2VJbnQoYVswXSwxMCk7YT1wYXJzZUludChhWzFdLDEwKTtjLT1rO2EtPWQ7Yz0xPD1tP2E6YztNYXRoLmFicyhjKTxwJiYwPD1jJiYocD1NYXRoLmFicyhjKSxxPWIpO01hdGguYWJzKGMpPGwmJihsPU1hdGguYWJzKGMpLHI9Yil9KTtxJiYocj1xKTtmLnNjaGVkdWxlKHIsYSk7Zi5maWxsKCk7cmV0dXJuIHJ9fQpmdW5jdGlvbiBwKCl7dCgiaW1nLmEtZHluYW1pYy1pbWFnZSIpLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmRhdGEoImEtbWFudWFsLXJlcGxhY2VtZW50Iil8fGUodGhpcyl9KX12YXIgdD1kLiQ7dChuKTt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIiksYT17fSxxPTAsZj1mdW5jdGlvbigpe3ZhciBjPVtdLGU9e307cmV0dXJue3NjaGVkdWxlOmZ1bmN0aW9uKGQsZil7ZD1iLmdlbmVyYXRlKGQsZi5hdHRyKCJjcm9zc29yaWdpbiIpKTtlW2RdfHwoYy5wdXNoKGQpLGVbZF09ITApO2FbZF09YVtkXXx8W107Zm9yKHZhciBoPTA7aDxhW2RdLmxlbmd0aDtoKyspaWYoZi5pcyhhW2RdW2hdKSlyZXR1cm47YVtkXS5wdXNoKGYpfSxmaWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTwyLXE7YSsrKWlmKDA8Yy5sZW5ndGgpe3ZhciBiPWMuc2hpZnQoKTtlW2JdPSExO2wubG9hZChiKX19fX0oKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShkKXt2YXIgZj1hW2RdLApoPWIucGFyc2UoZCkudXJsO2YmJihnLmVhY2goZixmdW5jdGlvbihhKXthLmRhdGEoImEtaW1hZ2UtcmVwbGFjZWQiKSE9PWgmJihhLmRhdGEoImEtaW1hZ2UtcmVwbGFjZWQiLGgpLGMuZGVmZXIoZnVuY3Rpb24oKXthLmF0dHIoInNyYyIsaCk7ay50cmlnZ2VyKCJhOmltYWdlOmxvYWQiLHskaW1hZ2VFbGVtZW50OmEsdXJsOmh9KTt2YXIgYj1hLmRhdGEoImEtaW1hZ2UtbmFtZSIpO2ImJmsudHJpZ2dlcigiYTppbWFnZTpsb2FkOiIrYix7JGltYWdlRWxlbWVudDphLHVybDpofSl9KSl9KSxhW2RdPVtdKX12YXIgZD17fTtyZXR1cm57bG9hZDpmdW5jdGlvbihhKXtpZihkW2FdKWUoYSk7ZWxzZSBpZighMSE9PWRbYV0pe3ZhciBoPW5ldyBJbWFnZTtoLm9ubG9hZD1mdW5jdGlvbigpe3EtLTtlKGEpO2RbYV09ITA7Zi5maWxsKCl9O2gub25lcnJvcj1mdW5jdGlvbigpe3EtLTtkW2FdPSExO2YuZmlsbCgpfTtxKys7Yy5kZWZlcihmdW5jdGlvbigpe3ZhciBjPWIucGFyc2UoYSksZT0KYy5jcm9zc09yaWdpbjtlJiYoaC5jcm9zc09yaWdpbj1lKTtoLnNyYz1jLnVybH0pfX0scG9sbDpmdW5jdGlvbigpe2cuaXNQYWdlSGlkZGVuKCl8fGcuZWFjaChyLGZ1bmN0aW9uKGEpe2E9dChhKTshYS5kYXRhKCJhLWhpcmVzIil8fGEuZGF0YSgiYS1oaXJlcy1sb2FkZWQiKXx8YS5kYXRhKCJhLW1hbnVhbC1yZXBsYWNlbWVudCIpfHxhLmlzKCI6aGlkZGVuIil8fCFnLm9uU2NyZWVuKGEpfHwoZi5zY2hlZHVsZShhLmRhdGEoImEtaGlyZXMiKSxhKSxhLmRhdGEoImEtaGlyZXMtbG9hZGVkIiwhMCkpfSl9fX0oKTtoLmNhcGFiaWxpdGllcy5oaXJlcyYmay5vbi5yZWFkeShmdW5jdGlvbigpe2cuaW50ZXJ2YWwoZnVuY3Rpb24oKXtsLnBvbGwoKTtmLmZpbGwoKX0sMkUzKX0pO2sub24ucmVhZHkocCk7dChuKS5yZXNpemUocCk7cmV0dXJue2xvYWRIaVJlc0ltYWdlOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO3QoYSkuZWFjaChmdW5jdGlvbigpe3ZhciBhPXQodGhpcyksYz1hLmRhdGEoImEtaGlyZXMiKTsKYyYmKGYuc2NoZWR1bGUoYyxhKSxmLmZpbGwoKSxiLnB1c2goYykpO2EuZGF0YSgiYS1oaXJlcy1sb2FkZWQiLCEwKX0pO3JldHVybiBifSxsb2FkRHluYW1pY0ltYWdlOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO3QoYSkuZWFjaChmdW5jdGlvbigpe2IucHVzaChlKHRoaXMpKX0pO3JldHVybiBifSxsb2FkSW1hZ2VNYW51YWxseTpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO3QoYSxiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9dCh0aGlzKTtpZighYS5kYXRhKCJhLWltYWdlLWFscmVhZHktbG9hZGVkIikpe2EuZGF0YSgiYS1pbWFnZS1hbHJlYWR5LWxvYWRlZCIsITApO3ZhciBiPWUoYSksZD10KCJceDNjaW1nXHgzZSIpLmF0dHIoInNyYyIsYnx8YS5kYXRhKCJhLWltYWdlLXNvdXJjZSIpKTtjLnB1c2goYik7dmFyIGI9IiIrdGhpcy5jbGFzc05hbWUsZj1hLmRhdGEoImEtZXh0cmEtY2xhc3NlcyIpO2YmJihiKz0iICIrZik7ZC5hdHRyKCJjbGFzcyIsYik7ZC5hdHRyKCJpZCIsdGhpcy5pZCk7CmQuYXR0cigic3R5bGUiLGEuYXR0cigic3R5bGUiKSk7ZC5hdHRyKCJhbHQiLGEuYXR0cigiYWx0IikpO2QuYXR0cigidXNlbWFwIixhLmF0dHIoInVzZW1hcCIpKTtkLmF0dHIoInRpdGxlIixhLmF0dHIoInRpdGxlIikpO2QuYXR0cigicm9sZSIsYS5hdHRyKCJyb2xlIikpOyhiPWEuZGF0YSgiYS1pbWFnZS1jcm9zc29yaWdpbiIpKSYmZC5hdHRyKCJjcm9zc29yaWdpbiIsYik7Zy5lYWNoKHRoaXMuYXR0cmlidXRlcyxmdW5jdGlvbihhKXthJiZhLm5hbWUmJigwPT09YS5uYW1lLmluZGV4T2YoImRhdGEtIil8fDA9PT1hLm5hbWUuaW5kZXhPZigiYXJpYS0iKSkmJmQuYXR0cihhLm5hbWUsYS52YWx1ZSl9KTtkLmRhdGEoYS5kYXRhKCkpO2EucmVwbGFjZVdpdGgoZCl9cmV0dXJuIGN9KX0sbG9hZERlc2NlbmRhbnRJbWFnZXNNYW51YWxseTpmdW5jdGlvbihhLGIpe2E9dChhLGIpLmZpbmQoImRpdi5hLW1hbnVhbGx5LWxvYWRlZCIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0KHRoaXMpLmRhdGEoImEtaW1hZ2UtYWxyZWFkeS1sb2FkZWQiKX0pOwpyZXR1cm4gdGhpcy5sb2FkSW1hZ2VNYW51YWxseShhKX19fSk7bS5yZWdpc3RlcigiYS1jbGFzcyIsZnVuY3Rpb24oKXtmdW5jdGlvbiBkKCl7fXZhciBnPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztkLmV4dGVuZD1mdW5jdGlvbihrKXt2YXIgYz10aGlzLnByb3RvdHlwZSxoPU9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZShjKTpmdW5jdGlvbihiKXtmdW5jdGlvbiBjKCl7fWMucHJvdG90eXBlPWI7cmV0dXJuIG5ldyBjfShjKSxiO2ZvcihiIGluIGspaFtiXT0iZnVuY3Rpb24iPT09dHlwZW9mIGtbYl0mJiJmdW5jdGlvbiI9PT10eXBlb2YgY1tiXSYmZy50ZXN0KGtbYl0pP2Z1bmN0aW9uKGIsZCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5fc3VwZXI7dGhpcy5fc3VwZXI9Y1tiXTt2YXIgZz1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLl9zdXBlcj1oO3JldHVybiBnfX0oYixrW2JdKTprW2JdO2s9ImZ1bmN0aW9uIj09PXR5cGVvZiBoLmluaXQ/CmguaGFzT3duUHJvcGVydHkoImluaXQiKT9oLmluaXQ6ZnVuY3Rpb24oKXtjLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ay5wcm90b3R5cGU9aDtoLmNvbnN0cnVjdG9yPWs7ay5leHRlbmQ9ZC5leHRlbmQ7cmV0dXJuIGt9O3JldHVybntjcmVhdGVDbGFzczpmdW5jdGlvbihnKXtyZXR1cm4gZC5leHRlbmQoZyl9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtdGltaW5nLWFuYWx5dGljcyIsImEtYm9keUJlZ2luIikuZXhlY3V0ZSgiYnVpbGQtQSIsZnVuY3Rpb24oZCl7dmFyIGc9bS5leGVjdXRlKCkuZGVjb3JhdGUsaz1tLndoZW4oImEtdXRpbCIsImEtZGVmZXIiLCJhLWJhc2UiLCJhLWV2ZW50cyIsImEtZGVjbGFyYXRpdmUiLCJhLXN0YXRlIiwiYS1hamF4IiwiYS1hbmltYXRlIiwiYS1pbWFnZSIsImEtY29uc3RhbnRzIiwiYS1kZXRlY3QiLCJhLWJyb3dzZXItZXZlbnRzIiwiYS1wcmVsb2FkIiwiYS1wcmVmaXgiLCJhLXJlcXVlc3QtYW5pbWF0aW9uLWZyYW1lIiwKImEtY2xhc3MiLCJhLWRyYWdnYWJsZSIpLnJlZ2lzdGVyKCJBIixmdW5jdGlvbihjKXtmdW5jdGlvbiBoKGUsZCl7dGhpcy5fZ3VhcmQ9ZTt0aGlzLl9sb2dFcnJvcj1kO2MuZWFjaChiLGZ1bmN0aW9uKGIpe2MuZXh0ZW5kKHRoaXMsbmV3IGIuY29uc3RydWN0b3IoZSxkKSl9LHRoaXMpfXZhciBiPVtdO2gucHJvdG90eXBlPXt9O2MuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSl7ZyYmZS5jb25zdHJ1Y3RvciE9PU9iamVjdD9iLnB1c2goZSk6KGRlbGV0ZSBlLmNvbnN0cnVjdG9yLGMuZXh0ZW5kKGgucHJvdG90eXBlLGUpKX0pO2Quc3RvcFdpZGdldExvZ2dpbmcoIkEiKTtyZXR1cm4gZz9oOmgucHJvdG90eXBlfSk7ZyYmay5kZWNvcmF0ZShmdW5jdGlvbihjLGQpe3JldHVybiBuZXcgYyhkLmd1YXJkLGQubG9nRXJyb3IpfSl9KTsidXNlIHN0cmljdCI7bS5yZWdpc3RlcigiYS1jb25zdGFudHMiLGZ1bmN0aW9uKCl7cmV0dXJue2NvbnN0YW50czp7a2V5Y29kZXM6e0JBQ0tTUEFDRTo4LApUQUI6OSxFTlRFUjoxMyxFU0NBUEU6MjcsU1BBQ0U6MzIsTEVGVF9BUlJPVzozNyxVUF9BUlJPVzozOCxSSUdIVF9BUlJPVzozOSxET1dOX0FSUk9XOjQwLERFTEVURTo0Nn0sZGVjbGFyYXRpdmVFdmVudHM6ImJsdXIgY2xpY2sgZGJsY2xpY2sgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBtb3VzZWRvd24gbW91c2V1cCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgbW91c2Vtb3ZlIGNoYW5nZSBzdWJtaXQgdG91Y2hzdGFydCB0b3VjaGVuZCB0b3VjaG1vdmUgdG91Y2hjYW5jZWwga2V5ZG93biBrZXl1cCBrZXlwcmVzcyBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIE1TUG9pbnRlckNhbmNlbCBwb2ludGVyY2FuY2VsIE1TUG9pbnRlck92ZXIgcG9pbnRlcmVudGVyIE1TUG9pbnRlck91dCBwb2ludGVybGVhdmUiLEhJREVfQ0xBU1M6ImFvay1oaWRkZW4iLFBBR0VTVEFURV9MT0FERURfTU9EVUxFX1BSRUZJWDoicGFnZS1zdGF0ZS1sb2FkZWQ6IiwKTk9PUDpmdW5jdGlvbigpe319fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImpRdWVyeSIsImEtZGV0ZWN0IiwiYS1ldmVudHMiLCJhLXV0aWwiLCJhLWRlZmVyIikucmVnaXN0ZXIoImEtYnJvd3Nlci1ldmVudHMiLGZ1bmN0aW9uKGQsZyxrLGMsaCl7ZnVuY3Rpb24gYigpe3JldHVybiB2b2lkIDA9PT1uLm9yaWVudGF0aW9uP3AoKT5lKCk/OTA6MDpuLm9yaWVudGF0aW9ufWZ1bmN0aW9uIGUoKXtyZXR1cm4gbi5pbm5lckhlaWdodD9uLmlubmVySGVpZ2h0OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gcCgpe3JldHVybiBuLmlubmVyV2lkdGg/bi5pbm5lcldpZHRoOmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aH1mdW5jdGlvbiB0KCl7cmV0dXJuIG4uaW5uZXJXaWR0aD9NYXRoLnJvdW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aC9uLmlubmVyV2lkdGgqMTApLzEwOjF9ZnVuY3Rpb24gcihhKXtzd2l0Y2goYSl7Y2FzZSBsLkFMTDphPQoib3JpZW50YXRpb24gaGVpZ2h0IHdpZHRoIHpvb20gc2Nyb2xsTGVmdCBzY3JvbGxUb3AiLnNwbGl0KCIgIik7YnJlYWs7Y2FzZSBsLlNDUk9MTDphPVsic2Nyb2xsTGVmdCIsInNjcm9sbFRvcCJdO2JyZWFrO2Nhc2UgbC5aT09NOmE9WyJoZWlnaHQiLCJ3aWR0aCIsInpvb20iLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsVG9wIl07YnJlYWs7ZGVmYXVsdDphPVsib3JpZW50YXRpb24iLCJoZWlnaHQiLCJ3aWR0aCIsInNjcm9sbExlZnQiLCJzY3JvbGxUb3AiXX1mb3IodmFyIGM9e30sZCxoO3ZvaWQgMCE9PShoPWEucG9wKCkpOylkPW1baF0sIm9yaWVudGF0aW9uIj09PWg/bVtoXT1iKCk6ImhlaWdodCI9PT1oP21baF09ZSgpOiJ3aWR0aCI9PT1oP21baF09cCgpOiJzY3JvbGxUb3AiPT09aD9tW2hdPW4uc2Nyb2xsWT9uLnNjcm9sbFk6Zi5zY3JvbGxUb3AoKToic2Nyb2xsTGVmdCI9PT1oP21baF09bi5zY3JvbGxYP24uc2Nyb2xsWDpmLnNjcm9sbExlZnQoKToiem9vbSI9PT1oJiYobVtoXT0KdCgpKSxtW2hdIT09ZCYmKGNbaF09ZCk7cmV0dXJuIGN9ZnVuY3Rpb24gYShhKXtpZihhPXdbYV0pYS5wb2xsQ291bnRlcj1hLm1heFBvbGxDb3VudCxhLmludGVydmFsSWR8fChhLmludGVydmFsSWQ9c2V0SW50ZXJ2YWwoYS5oYW5kbGVyLGEucG9sbEludGVydmFsKSl9ZnVuY3Rpb24gcShhKXsoYT13W2FdKSYmYS5pbnRlcnZhbElkJiYoY2xlYXJJbnRlcnZhbChhLmludGVydmFsSWQpLGEuaW50ZXJ2YWxJZD0wKX12YXIgZj1kKG4pLGw9e09SSUVOVEFUSU9OX0NIQU5HRToib3JpZW50YXRpb25jaGFuZ2UiLFNDUk9MTDoic2Nyb2xsIixSRVNJWkU6InJlc2l6ZSIsWk9PTToiem9vbSIsQUxMOiJhbGwifSxtPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjAsaGVpZ2h0OmUoKSx3aWR0aDpwKCksb3JpZW50YXRpb246YigpLHpvb206dCgpfTtrLm9uKCJiZWZvcmVSZWFkeSIsZnVuY3Rpb24oKXtyKGwuQUxMKX0pO3ZhciB1PXtzcGVlZDowLGRlZ3JlZTowLGRpcmVjdGlvbjoiIixwb3NpdGlvblg6MCwKcG9zaXRpb25ZOjB9LHY9W10seTtmLmJpbmQoIm1vdXNlbW92ZSIsYy50aHJvdHRsZShmdW5jdGlvbihhKXthPXt4OmEuY2xpZW50WCx5OmEuY2xpZW50WX07aWYoeSl7dmFyIGI9eSxjPTAsZT0wO3YucHVzaCh7c3BlZWQ6TWF0aC5zcXJ0KE1hdGgucG93KGEueC1iLngsMikrTWF0aC5wb3coYS55LWIueSwyKSkvNTAqMTAsZGVncmVlOk1hdGguYXRhbjIoYS55LWIueSxhLngtYi54KS8oTWF0aC5QSS8xODApfSk7NDx2Lmxlbmd0aCYmKHY9di5zbGljZSgtNCkpO2Zvcih2YXIgYj12Lmxlbmd0aCxkPTA7ZDxiO2QrKyljKz12W2RdLnNwZWVkLGUrPXZbZF0uZGVncmVlO2M9TnVtYmVyKChjL2IpLnRvRml4ZWQoMikpO2U9TWF0aC5yb3VuZChlL2IpO3U9e3NwZWVkOmMsZGVncmVlOmUsZGlyZWN0aW9uOjA8PWU/MTU3LjU8ZT8iVyI6MTEyLjU8ZT8iU1ciOjY3LjU8ZT8iUyI6MjIuNTxlPyJTRSI6IkUiOi0xNTcuNT5lPyJXIjotMTEyLjU+ZT8iTlciOi02Ny41PmU/Ik4iOi0yMi41PmU/CiJORSI6IkUiLHBvc2l0aW9uWDphLngscG9zaXRpb25ZOmEueX07eT1hfWVsc2UgYSYmKHk9YSl9LDUwKSk7Zi5iaW5kKGwuU0NST0xMLGMudGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgYT1yKGwuU0NST0xMKTtrLnRyaWdnZXIobC5TQ1JPTEwsbSxhKX0sMTAwKSk7dmFyIHc9e307Yy5lYWNoKFtsLlJFU0laRSxsLlpPT01dLGZ1bmN0aW9uKGEpe3dbYV09e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGxhc3RWaWV3cG9ydDpjLmNvcHkobSksbWF4UG9sbENvdW50OjUscG9sbENvdW50ZXI6NSxwb2xsSW50ZXJ2YWw6MTAwLGludGVydmFsSWQ6MH19KTt3LnJlc2l6ZS5oYW5kbGVyPWZ1bmN0aW9uKCl7dmFyIGE9W10sYj13LnJlc2l6ZTtyKCJyZXNpemUiKTt2YXIgZT1jLmRpZmYobSxiLmxhc3RWaWV3cG9ydCk7ZS5vcmllbnRhdGlvbiYmYS5wdXNoKGwuT1JJRU5UQVRJT05fQ0hBTkdFKTtlLndpZHRofHxlLmhlaWdodD9hLnB1c2gobC5SRVNJWkUpOmcuY2FwYWJpbGl0aWVzLmlzSUVUb3VjaENhcGFibGUmJgplLnNjcm9sbFRvcCYmYS5wdXNoKGwuUkVTSVpFKTthLmxlbmd0aCYmKGIubGFzdFZpZXdwb3J0PWMuY29weShtKSxjLmVhY2goYSxmdW5jdGlvbihhKXtrLnRyaWdnZXIoYSxtLGUpfSkpOzA9PT0tLWIucG9sbENvdW50ZXImJnEobC5SRVNJWkUpfTt3LnJlc2l6ZS5wb2xsSW50ZXJ2YWw9MTAwO3cucmVzaXplLm1heFBvbGxDb3VudD0xMDtmLmJpbmQobC5SRVNJWkUsZnVuY3Rpb24oYil7YShsLlJFU0laRSl9KTt3Lnpvb20uaGFuZGxlcj1mdW5jdGlvbigpe3IobC5aT09NKTt2YXIgYT13Lnpvb20sYj1jLmRpZmYobSxhLmxhc3RWaWV3cG9ydCk7Yi56b29tJiYoYS5sYXN0Vmlld3BvcnQ9Yy5jb3B5KG0pLGsudHJpZ2dlcihsLlpPT00sbSxiKSk7MD09PS0tYS5wb2xsQ291bnRlciYmcShsLlpPT00pfTt3Lnpvb20ucG9sbEludGVydmFsPTIwMDtnLmNhcGFiaWxpdGllcy5hbmRyb2lkJiZmLmJpbmQoInRvdWNoY2FuY2VsIixmdW5jdGlvbihiKXsyPT09Yi5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmCih3Lnpvb20ubWF4UG9sbENvdW50PTE1LGEobC5aT09NKSl9KTtnLmNhcGFiaWxpdGllcy5pb3MmJmYuYmluZCgidG91Y2hlbmQiLGZ1bmN0aW9uKGIpezE9PT1iLm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGgmJih3Lnpvb20ubWF4UG9sbENvdW50PTEsYShsLlpPT00pKX0pO2cuY2FwYWJpbGl0aWVzLmlvc3x8Zy5jYXBhYmlsaXRpZXMuYW5kcm9pZHx8Zi5iaW5kKCJyZXNpemUiLGZ1bmN0aW9uKGIpe3cuem9vbS5tYXhQb2xsQ291bnQ9NTthKGwuWk9PTSl9KTtyZXR1cm57dmlld3BvcnQ6ZnVuY3Rpb24oYSl7YSYmcihsLkFMTCk7cmV0dXJuIGMuY29weShtKX0sY3Vyc29yOmZ1bmN0aW9uKCl7cmV0dXJuIGMuY29weSh1KX0sc2Nyb2xsQmFyV2lkdGg6ZnVuY3Rpb24oYSl7aWYoYXx8KGRvY3VtZW50JiZkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodD9kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDowKT5lKCkpe2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmEuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIjthLnN0eWxlLndpZHRoPSIxMDAlIjthLnN0eWxlLm92ZXJmbG93WD0ic2Nyb2xsIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO3ZhciBiPWEub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7cmV0dXJuIGJ9cmV0dXJuIDB9fX0pOyJ1c2Ugc3RyaWN0IjttLnJlZ2lzdGVyKCJhLWFuYWx5dGljcyIsZnVuY3Rpb24oKXtmdW5jdGlvbiBkKGQsayl7dmFyIGM9biYmbi51ZSYmbi51ZS5jb3VudDtpZihjJiZkKXt2YXIgaD0iYXVpOiIrZDsxPGFyZ3VtZW50cy5sZW5ndGgmJmMoaCxrKTtyZXR1cm4gYyhoKX19cmV0dXJue2luY3JlbWVudDpmdW5jdGlvbihnLGspe2lmKGcpe3ZhciBjPWQoZyl8fDA7ZChnLGMrKGt8fDEpKX19LGNvdW50OmQsbG9nRXJyb3I6ZnVuY3Rpb24oZCxrLGMpe24udWVMb2dFcnJvciYmbi51ZUxvZ0Vycm9yKHttZXNzYWdlOmR9LHtsb2dMZXZlbDprLGF0dHJpYnV0aW9uOmN9KX19fSk7CiJ1c2Ugc3RyaWN0IjttLndoZW4oIjNwLXByb21pc2UiLCJhLWFuYWx5dGljcyIpLnJlZ2lzdGVyKCJhLXByZWxvYWQiLGZ1bmN0aW9uKGQsZyl7ZnVuY3Rpb24gaygpe2lmKDA8Ri5sZW5ndGgpeT1GO2Vsc2UgaWYoeT13LDA9PT15Lmxlbmd0aHx8IXopcmV0dXJuITE7aWYoRT49SSlyZXR1cm4hMTtFKys7cmV0dXJuITB9ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPWZ1bmN0aW9uKCl7aWYoYSl7dmFyIGI9YS5wYXJlbnRFbGVtZW50O2ImJmIucmVtb3ZlQ2hpbGQoYSk7YT1udWxsfX07YiYmY2xlYXJUaW1lb3V0KGIpO0U9MT5FPzA6RS0xO0I/cShjLDUpOmMoKTtBP3EodCwwKTp0KCl9ZnVuY3Rpb24gaChhKXt2YXIgYixjO2M9YS5pbmRleE9mKCIjIik7dmFyIGU9YS5pbmRleE9mKCI/IiksZT0wPGU/ZTowPGM/YzphLmxlbmd0aDsoYz1hLmxhc3RJbmRleE9mKCIuIixlKSkmJihiPWEuc3Vic3RyaW5nKGMrMSxlKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4iZ3oiPT09Yj9oKGEuc3Vic3RyaW5nKDAsCmMpKTpifWZ1bmN0aW9uIGIoYSl7Zm9yKHZhciBiPUcubGVuZ3RoO2ItLTspaWYoR1tiXT09PWEpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZShhLGIsYyl7dmFyIGU7Qj8ianMiIT09YiYmKGU9Ik9CSkVDVCIpOkE/KGU9IklNRyIsYXx8KDEwPD1DP2U9IkxJTksiOjk9PT1DJiYoZT0iU0NSSVBUIikpKTplPSJJTUciO3JldHVybiBlfWZ1bmN0aW9uIHAoYSxiLGUsZCl7dmFyIGY7aWYoQnx8RCYmIWUpZj1xKGZ1bmN0aW9uKCl7ZCgpO2MoYSxmKX0sMjUwMCsxMDAqTWF0aC5yYW5kb20oKSk7YS5vbmVycm9yPWZ1bmN0aW9uKCl7ZCgpO2MoYSxmKX07YS5vbmxvYWQ9ZnVuY3Rpb24oKXtkKCk7YyhhLGYpfX1mdW5jdGlvbiB0KCl7ZnVuY3Rpb24gYSgpe3ZhciBiPURhdGUubm93KCkteDtkLnJlc29sdmUoe3VybDpyLHN1Y2Nlc3M6ITAsZHVyYXRpb246Yn0pfWlmKGsoKSl7dmFyIGQ9eS5wb3AoKSxyPWQudXJsLG09aChyKSxuPWIobSksbT1lKG4sbSx5PT09Riksdz0xLHU9IiIseD0KRGF0ZS5ub3coKSx2O2lmKG0pe3Y9IklNRyI9PT1tP25ldyBJbWFnZTpmLmNyZWF0ZUVsZW1lbnQobSk7di5zdHlsZS5kaXNwbGF5PSJub25lIjtpZigiSUZSQU1FIj09PW0pZm9yKHc9MDtyOylCJiYianMiPT09aChyKXx8KHUrPSJceDNjbGluayByZWxceDNkJ3ByZWZldGNoJyBocmVmXHgzZCciK3IrIicvXHgzZSIsdysrKSxyPXkucG9wKCk7ZWxzZSJJTUciPT09bT8ocCh2LG0sbixhKSx2LnNyYz1yKToiT0JKRUNUIj09PW0/KHYuZGF0YT1yLHAodixtLG4sYSkpOiJTQ1JJUFQiPT09bT8odi50eXBlPSJ0ZXh0L2NhY2hlIixwKHYsbSxuLGEpLHYuc3JjPXIpOiJMSU5LIj09PW0mJih2LnJlbD0ic3R5bGVzaGVldCIsdi5tZWRpYT0ic3BlZWNoIixwKHYsbSxuLGEpLHYuaHJlZj1yKTtpZighQXx8IklNRyIhPT1tKXRyeXtpZihsLmFwcGVuZENoaWxkKHYpLHUpe3ZhciB6PXYuY29udGVudFdpbmRvdy5kb2N1bWVudDt6Lm9wZW4oKTt6LndyaXRlKHUpO3ouY2xvc2UoKTtxKGMsMCl9fWNhdGNoKEQpe2QucmVqZWN0KHt1cmw6ciwKc3VjY2VzczohMSxyZWFzb246ImZhaWxlZCB0byBhcHBlbmRDaGlsZCJ9KTtjKCk7cmV0dXJufWcuaW5jcmVtZW50KCJwcmVsb2FkX2Z1bGZpbGxlZCIsdyk7RTxJJiZ0KCl9ZWxzZSBkLnJlamVjdCh7dXJsOnIsc3VjY2VzczohMSxlcnJvcjoibm90IHN1cHBvcnRlZCB0eXBlIn0pLGMoKX19ZnVuY3Rpb24gcihhLGIpe3JldHVybiBuZXcgZChmdW5jdGlvbihjLGUpe2Euc3BsaWNlKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSphLmxlbmd0aCksMCx7dXJsOmIscmVzb2x2ZTpjLHJlamVjdDplfSl9KX1mdW5jdGlvbiBhKGIsYyl7aWYoIUgpcmV0dXJuIGQucmVqZWN0KCJub3Qgc3VwcG9ydGVkIGJyb3dzZXIiKTtpZigic3RyaW5nIj09PXR5cGVvZiBiKWI9W2JdO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuIGQucmVqZWN0KCJub3QgYW4gVVJMIG9yIFVSTCBsaXN0Iik7dmFyIGUsZixoPVtdO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspKGY9YltlXSkmJgoic3RyaW5nIiE9PXR5cGVvZiBmP2EoZixjKTpmJiYiICIhPT1mWzBdJiYoaC5wdXNoKHIoYyxmKSksZy5pbmNyZW1lbnQoInByZWxvYWRfYXNrcyIpKTtyZXR1cm4gMD09PWgubGVuZ3RoP2QucmVzb2x2ZSgpOjE9PT1oLmxlbmd0aD9oWzBdOmQuYWxsKGgpfXZhciBxPXNldFRpbWVvdXQsZj1kb2N1bWVudCxsPWYuZG9jdW1lbnRFbGVtZW50LHg9bC5zdHlsZSx1PW5hdmlnYXRvcix2PXUudXNlckFnZW50LHk9W10sdz1bXSxGPVtdLHo9ITEsQj0iTW96QXBwZWFyYW5jZSJpbiB4LEQ9IUImJiJ3ZWJraXRBcHBlYXJhbmNlImluIHg7RCYmL15BcHBsZS8udGVzdCh1LnZlbmRvcik7dmFyIEE9IUImJiFEJiYoMD09PXUuYXBwTmFtZS5pbmRleE9mKCJNaWNyb3NvZnQiKXx8LTE8di5pbmRleE9mKCJUcmlkZW50LyIpKSxIPUR8fEJ8fEEseD1BP251bGwhPT0vVHJpZGVudFwvKFtcZF0rKS8uZXhlYyh2KT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSk6bnVsbDotMSxDPUE/eD94KzQ6NjotMSxJPSJ1bmRlZmluZWQiIT09CnR5cGVvZiBuLnBsQ291bnQ/bi5wbENvdW50KCk6QSYmOD5DPzI6NSxFPTAsSj0hMSxHPVsiZ2lmIiwianBlZyIsImpwZyIsInBuZyJdO20ud2hlbigiYS1wcmVsb2FkLWFwaS11c2VkIiwiYWZ0ZXJMb2FkIikuZXhlY3V0ZSgiYS1wcmVsb2FkLWxvdy1wcmlvcml0eSIsZnVuY3Rpb24oKXt6PSEwO3QoKX0pO3JldHVybntwcmVsb2FkOmZ1bmN0aW9uKGIsYyl7Yz9iPWEoYixGKTooSnx8KEo9ITAsbS5kZWNsYXJlKCJhLXByZWxvYWQtYXBpLXVzZWQiKSksYj1hKGIsdykpO3QoKTtyZXR1cm4gYn19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiYS11dGlsIikucmVnaXN0ZXIoImEtcmVxdWVzdC1hbmltYXRpb24tZnJhbWUiLGZ1bmN0aW9uKGQpe2Zvcih2YXIgZz0wLGs9WyJtcyIsIm1veiIsIndlYmtpdCIsIm8iXSxjPTA7YzxrLmxlbmd0aCYmIW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lOysrYyluLnJlcXVlc3RBbmltYXRpb25GcmFtZT1uW2tbY10rIlJlcXVlc3RBbmltYXRpb25GcmFtZSJdLApuLmNhbmNlbEFuaW1hdGlvbkZyYW1lPW5ba1tjXSsiQ2FuY2VsQW5pbWF0aW9uRnJhbWUiXXx8bltrW2NdKyJDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXTtuLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KG4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGMsYil7dmFyIGU9ZC5ub3coKSxrPU1hdGgubWF4KDAsMTYtKGUtZykpO2I9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhlK2spfSxrKTtnPWUraztyZXR1cm4gYn0pO24uY2FuY2VsQW5pbWF0aW9uRnJhbWV8fChuLmNhbmNlbEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGMpe2NsZWFyVGltZW91dChjKX0pO3JldHVybntyZXF1ZXN0QW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24oYyxiKXtyZXR1cm4gbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYyxiKX0sY2FuY2VsQW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24oYyl7bi5jYW5jZWxBbmltYXRpb25GcmFtZShjKX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigialF1ZXJ5IiwiQSIsCiIzcC1wcm9taXNlIikucmVnaXN0ZXIoImEtZm9udHMiLGZ1bmN0aW9uKGQsZyxrKXtmdW5jdGlvbiBjKGIsYSl7dmFyIGM9bSYmbVtiXT9tOmE7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGNbYl0uYXBwbHkoYyxhcmd1bWVudHMpfX12YXIgaD1bXSxiPWQoImJvZHkiKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrKGZ1bmN0aW9uKGIsYSl7dmFyIGM9bi5zZXRJbnRlcnZhbChmdW5jdGlvbigpe2cucmVkdWNlKGgsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmImxvYWRlZCI9PT1iLnN0YXR1c30sITApJiYoYigpLGNsZWFySW50ZXJ2YWwoYykpfSw1MCl9KX0oKSxwPXtsb2FkOmZ1bmN0aW9uKGMpe3JldHVybiBuZXcgayhmdW5jdGlvbihhLGUpe3ZhciBmPXt2YXJpYW50OmMsc3RhdHVzOiJ1bmxvYWRlZCJ9O2gucHVzaChmKTtmLiRsb2FkZXI9ZCgiXHgzY3NwYW5ceDNlLlx4M2Mvc3Bhblx4M2UiLHsiY2xhc3MiOiJhb2staGlkZGVuIn0pLmNzcygiZm9udCIsZi52YXJpYW50KS5hcHBlbmRUbyhiKTsKZi5zdGF0dXM9ImxvYWRpbmciO2YuJGNoZWNrZXI9ZCgiXHgzY3NwYW5ceDNlLlx4M2Mvc3Bhblx4M2UiLHsiY2xhc3MiOiJhb2staGlkZGVuIn0pLmFwcGVuZFRvKGIpO2YuaW50ZXJ2YWxJZD1uLnNldEludGVydmFsKGZ1bmN0aW9uKCl7Zi4kY2hlY2tlci5jc3MoImZvbnQiLGYudmFyaWFudCsnLCBDb25zb2xhcywgIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlJyk7dmFyIGI9Zi4kY2hlY2tlci53aWR0aCgpLGM9Zi4kY2hlY2tlci5oZWlnaHQoKTtmLiRjaGVja2VyLmNzcygiZm9udEZhbWlseSIsJ0NvbnNvbGFzLCAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2UnKTtpZihmLiRjaGVja2VyLndpZHRoKCkhPT1ifHxmLiRjaGVja2VyLmhlaWdodCgpIT09YylhKGYudmFyaWFudCksZi5zdGF0dXM9ImxvYWRlZCIsZi4kbG9hZGVyLnJlbW92ZSgpLGYuJGNoZWNrZXIucmVtb3ZlKCksY2xlYXJJbnRlcnZhbChmLmludGVydmFsSWQpfSw1MCl9KX0sY2hlY2s6ZnVuY3Rpb24oYil7Zy5lYWNoKGgsCmZ1bmN0aW9uKGEpe2lmKGEudmFyaWFudD09PWIpcmV0dXJuImxvYWRlZCI9PT1hLnN0YXR1c30pO3JldHVybiExfSxyZWFkeTplfSxtPWRvY3VtZW50LmZvbnRzO20mJm0ucmVhZHkmJihlPW0ucmVhZHkudGhlbj9tLnJlYWR5Om0ucmVhZHkuYXBwbHkobSkpO3JldHVybntsb2FkOmMoImxvYWQiLHApLGNoZWNrOmMoImNoZWNrIixwKSxyZWFkeTplfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiKS5yZWdpc3RlcigiYS1mb3JtLWNvbnRyb2xzLWFwaSIsZnVuY3Rpb24oZCl7dmFyIGc9ZC4kLGs9MCxjPWZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmpxdWVyeT9iOmImJjE9PT1iLm5vZGVUeXBlP2coYik6bnVsbH0saD1mdW5jdGlvbihiLGUsZCl7dmFyIGg9YyhiKTtpZighaHx8MSE9PWgubGVuZ3RoKXJldHVybiExO2I9aC5maW5kKCJpbnB1dCIpLmZpcnN0KCk7dm9pZCAwIT09ZSYmKGU9ISFlLGguaGFzQ2xhc3MoImEtdG91Y2gtbXVsdGktc2VsZWN0IikmJihoLmZpbmQoImkuYS1pY29uIikuZmlyc3QoKS50b2dnbGVDbGFzcygiYS1pY29uLXRvdWNoLW11bHRpLXNlbGVjdC1hY3RpdmUiLAplKS50b2dnbGVDbGFzcygiYS1pY29uLXRvdWNoLW11bHRpLXNlbGVjdCIsIWUpLGguYXR0cigiYXJpYS1jaGVja2VkIixlKSksYi5wcm9wKCJjaGVja2VkIikhPT1lJiZiLnByb3AoImNoZWNrZWQiLGUpLnRyaWdnZXIoImNoYW5nZSIpKTt2b2lkIDAhPT1kJiYoZD0hIWQsYi5wcm9wKCJkaXNhYmxlZCIpIT09ZCYmYi5wcm9wKCJkaXNhYmxlZCIsZCkpfTtyZXR1cm57ZmluZEZvcm1FbGVtZW50Q29udGFpbmVyOmZ1bmN0aW9uKGIpe2lmKChiPWMoYikpJiYxPT09Yi5sZW5ndGgpe3ZhciBlPWIuY2xvc2VzdCgiZm9ybSIpOzA9PT1lLmxlbmd0aCYmKGU9Yi5jbG9zZXN0KCJmaWVsZHNldCIpLDA9PT1lLmxlbmd0aCYmKGU9Zyhkb2N1bWVudCkpKTtyZXR1cm4gZX19LHRvZ2dsZUNoZWNrYm94U3RhdGU6ZnVuY3Rpb24oYil7Yj1jKGIpO3ZhciBlO2ImJjE9PT1iLmxlbmd0aCYmKGU9Yi5maW5kKCJpbnB1dCIpLmZpcnN0KCksaChiLCFlWzBdLmNoZWNrZWQpKX0sc2V0Q2hlY2tib3hTdGF0ZTpoLApzZXRSYWRpb1N0YXRlOmgsbm9ybWFsaXplRWxlbWVudDpmdW5jdGlvbihiKXtpZigoYj0oYj1jKGIpKT9iOmModGhpcykpJiYxPT09Yi5sZW5ndGgpe3ZhciBlPWIuZmluZCgiaW5wdXQiKS5maXJzdCgpO2UuYXR0cigidHlwZSIpO3ZhciBkPWIuaGFzQ2xhc3MoImEtdG91Y2gtbXVsdGktc2VsZWN0Iik7Yi5hdHRyKCJpZCIpfHxlLmF0dHIoImlkIil8fGQmJighZHx8Yi5wYXJlbnQoKS5hdHRyKCJpZCIpKXx8KGQ9ImEtZm9ybS1jb250cm9scy1hdXRvaWQtIitrLGIuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixkKS5maW5kKCIuYS1jaGVja2JveC1sYWJlbCwgLmEtcmFkaW8tbGFiZWwsIC5hLXRvdWNoLW11bHRpLXNlbGVjdC1pdGVtLWxhYmVsIikuYXR0cigiaWQiLGQpLGsrKyk7aChiLGVbMF0uY2hlY2tlZCxlWzBdLmRpc2FibGVkKX19LG5vcm1hbGl6ZUZpZWxkc2V0czpmdW5jdGlvbihiKXtnKGIpLmNsb3Nlc3QoImZpZWxkc2V0IikuZWFjaChmdW5jdGlvbihiLGMpe2I9ZyhjKTsKYz1iLmZpbmQoImxlZ2VuZCIpLmZpcnN0KCk7aWYoYy5sZW5ndGgpe3ZhciBkPWMuYXR0cigiaWQiKTtkfHwoZD0iYS1mb3JtLWNvbnRyb2xzLWF1dG9pZC0iK2ssYy5hdHRyKCJpZCIsZCksaysrKTtiLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLGQpfX0pfX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJqUXVlcnkiLCJhLXV0aWwiLCJhLXN0YXRlIiwiYS1hbmFseXRpY3MiLCJhLWNvbnN0YW50cyIpLmV4ZWN1dGUoInByZXBhcmUtYS13ZWJsYWIiLGZ1bmN0aW9uKGQsZyxrLGMsaCl7bS53aGVuKGguY29uc3RhbnRzLlBBR0VTVEFURV9MT0FERURfTU9EVUxFX1BSRUZJWCsiYS13bGFiLXN0YXRlcyIpLnJlZ2lzdGVyKCJhLXdlYmxhYiIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShhKXtmfHwodVthXT1xW2FdKTtyZXR1cm4gZiYmZlthXXx8cVthXX1mdW5jdGlvbiBrKGEpe3JldHVybiBlKGEpfHwiQyJ9ZnVuY3Rpb24gdChiKXt2YXIgYz1lKGIpOyFjfHxsW2JdfHx4W2JdfHwobFtiXT1jLApjbGVhclRpbWVvdXQodiksdj1zZXRUaW1lb3V0KGEsNUUzKSk7cmV0dXJuIGN8fCJDIn1mdW5jdGlvbiByKGEpe3JldHVybiB2b2lkIDAhPT1hJiZuLmVuY29kZVVSSUNvbXBvbmVudChhKXx8IiJ9ZnVuY3Rpb24gYSgpe3ZhciBhPVtdO2cuZWFjaChsLGZ1bmN0aW9uKGIsYyl7YS5wdXNoKGMrIjoiK2IpO3hbY109MX0pO2lmKGEubGVuZ3RoKXt2YXIgYj15K3IoYS5qb2luKCIsIikpKyJceDI2dFx4M2QiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKyJceDI2dHlwZVx4M2QiLGU9bi5uYXZpZ2F0b3I7ZS5zZW5kQmVhY29uJiZlLnNlbmRCZWFjb24oYisiYiIpP2MuaW5jcmVtZW50KCJ3bGFiQmNuIik6KChuZXcgSW1hZ2UpLnNyYz1iKyJpIixjLmluY3JlbWVudCgid2xhYkltZyIpKX1sPXt9O2NsZWFyVGltZW91dCh2KX12YXIgcT1ifHx7fSxmLGw9e30seD17fSx1PXt9LHY7bS53aGVuKGguY29uc3RhbnRzLlBBR0VTVEFURV9MT0FERURfTU9EVUxFX1BSRUZJWCsiYS1sdHJlZS1zdGF0ZXMiKS5leGVjdXRlKGZ1bmN0aW9uKGEpe2Y9CmF8fHt9O2cuZWFjaChnLmtleXModSksZnVuY3Rpb24oYSl7KGZbYV18fHVbYV0pJiZmW2FdIT09dVthXSYmbS5sb2coImEtd2VibGFiIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciAiK2ErIi4gSXQgcmV0dXJuZWQgIit1W2FdKyIuIGl0IGlzIHNldCBhcyAiK2ZbYV0rIiBhdCBhLWx0cmVlLXN0YXRlcy4iKX0pfSk7dmFyIHk9Ii9ncC9hdWkvcmVjb3JkLmh0bWw/cmlkXHgzZCIrcihuLnVlX2lkKSsiXHgyNnNpZFx4M2QiK3Iobi51ZV9zaWQpKyJceDI2d2xhYlx4M2QiO2QobikuYmluZCgidW5sb2FkIixhKTtyZXR1cm57aXM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybihjP3QoYSk6ayhhKSk9PT1ifSxpc0FjdGl2ZTpmdW5jdGlvbihhKXtyZXR1cm4hIWUoYSl9LG5vVHJpZ2dlcjprLHRyaWdnZXI6dH19KX0pOyJ1c2Ugc3RyaWN0IjttLmRlY2xhcmUoInBydjphLXBvc3QtYXRmLWNhdGNoZG9tcmVhZHkiLCEwKTttLndoZW4oImEtdXRpbCIsImEtZGVmZXIiLCJwcnY6YS1wb3N0LWF0Zi1jYXRjaGRvbXJlYWR5IikucmVnaXN0ZXIoInBydjphLXBvc3QtYXRmIiwKZnVuY3Rpb24oZCxnLGspe2Z1bmN0aW9uIGMoKXtlfHwoZT0hMCxkLmVhY2goYixmdW5jdGlvbihiKXtnLmRlZmVyKGIpfSksYj1bXSl9ZnVuY3Rpb24gaCgpe2smJmMoKX12YXIgYj1bXSxlPSExO20ud2hlbigiYWYiLCJjZiIpLmV4ZWN1dGUoImZsdXNoX3F1ZXVlZF9mdW5jdGlvbnNfYWZ0ZXJfQVRGIixjKTttLndoZW4oImEtZG9tcmVhZHkiKS5leGVjdXRlKCJmbHVzaF9xdWV1ZWRfZnVuY3Rpb25zX2FmdGVyX2RvbXJlYWR5IixmdW5jdGlvbigpe2QuZGVsYXkoaCw1MDApfSk7cmV0dXJue2V4ZWN1dGU6ZnVuY3Rpb24oYyl7ZT9nLmRlZmVyKGMpOmIucHVzaChjKX19fSk7InVzZSBzdHJpY3QiO20uZGVjbGFyZSgicHJ2OmEtaXMtdHlwZWRhcnJheS1zdXBwb3J0ZWQiLCEoIW4uQXJyYXlCdWZmZXJ8fCFuLlVpbnQ4QXJyYXkpKTttLndoZW4oImEtY2xhc3MiLCJwcnY6YS1pcy10eXBlZGFycmF5LXN1cHBvcnRlZCIpLnJlZ2lzdGVyKCJwcnY6YS1iaXQtYXJyYXkiLGZ1bmN0aW9uKGQsCmcpe2Z1bmN0aW9uIGsoYyl7cmV0dXJuIGZ1bmN0aW9uKGIsZSl7Ynw9MDtlPShlfDApKyhiLzg+PjApO2IlPTg7aWYoZTx0aGlzLmJ5dGVMZW5ndGgoKSlyZXR1cm4gYy5jYWxsKHRoaXMsYixlKX19dmFyIGM9ZC5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihjKXt0aGlzLl9iaXRzQnVmZmVyPWN9LGJ5dGVMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYml0c0J1ZmZlci5sZW5ndGh9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGM7dHJ5e2M9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHRoaXMuX2JpdHNCdWZmZXIpfWNhdGNoKGIpe2M9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFtdLnNsaWNlLmNhbGwodGhpcy5fYml0c0J1ZmZlcikpfXJldHVybiBjfSxzZXRCeXRlOmZ1bmN0aW9uKGMsYil7Ynw9MDtiPHRoaXMuX2JpdHNCdWZmZXIubGVuZ3RoJiYodGhpcy5fYml0c0J1ZmZlcltiXT1jKX0sZ2V0Qnl0ZTpmdW5jdGlvbihjKXtpZihjPHRoaXMuYnl0ZUxlbmd0aCgpKXJldHVybiB0aGlzLl9iaXRzQnVmZmVyW2NdfSwKc2V0OmsoZnVuY3Rpb24oYyxiKXt0aGlzLl9iaXRzQnVmZmVyW2JdfD0xPDxjfSksdW5zZXQ6ayhmdW5jdGlvbihjLGIpe3RoaXMuX2JpdHNCdWZmZXJbYl1ePXRoaXMuX2JpdHNCdWZmZXJbYl0mMTw8Y30pLGdldDprKGZ1bmN0aW9uKGMsYil7cmV0dXJuIHRoaXMuX2JpdHNCdWZmZXJbYl0mMTw8Yz8xOjB9KX0pO2MuY3JlYXRlPWZ1bmN0aW9uKGQpe3JldHVybiBjLmNyZWF0ZUJ5dGVMZW5ndGgoKGQtMSkvOCsxPj4wKX07Yy5jcmVhdGVCeXRlTGVuZ3RoPWZ1bmN0aW9uKGQpe3ZhciBiO2lmKGcpYj1uZXcgVWludDhBcnJheShkKTtlbHNlIGZvcihiPUFycmF5KGQpLC0tZDswPD1kO2QtLSliW2RdPTA7cmV0dXJuIG5ldyBjKGIpfTtjLmZyb21BcnJheT1mdW5jdGlvbihkKXtpZihnKWQ9bmV3IFVpbnQ4QXJyYXkoZCk7ZWxzZXtkPVtdLnNsaWNlLmNhbGwoZCk7Zm9yKHZhciBiPWQubGVuZ3RoLTE7MDw9YjtiLS0pMjU2PD1kW2JdJiYoZFtiXSU9MjU2KX1yZXR1cm4gbmV3IGMoZCl9OwpjLmZyb21TdHJpbmc9ZnVuY3Rpb24oZCl7Zm9yKHZhciBiPWQubGVuZ3RoLGU9QXJyYXkoYiksYj1iLTE7MDw9YjtiLS0pZVtiXT1kLmNoYXJDb2RlQXQoYik7cmV0dXJuIGMuZnJvbUFycmF5KGUpfTtyZXR1cm4gY30pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtdXRpbCIpLnJlZ2lzdGVyKCJwcnY6YS1jb29raWUtd3JpdGVyIixmdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oZyxrLGMpe3ZhciBoPVtdLGI7az1kLnRyaW0oayk7aWYoLTE8ay5pbmRleE9mKCciJyl8fC0xPGsuaW5kZXhPZigiXFwiKSlrPSciJytrLnJlcGxhY2UoLygifFxcKS9nLCJcXCQxIikrJyInO2M9Y3x8e307Yy5wYXRoJiZoLnB1c2goIjtwYXRoXHgzZCIrYy5wYXRoKTtjLmRvbWFpbiYmaC5wdXNoKCI7ZG9tYWluXHgzZCIrYy5kb21haW4pO2MubWF4QWdlJiZoLnB1c2goIjttYXgtYWdlXHgzZCIrYy5tYXhBZ2UpO2MuZXhwaXJlcyYmKGI9Yy5leHBpcmVzLGMuZXhwaXJlcy5nZXRUaW1lJiZjLmV4cGlyZXMudG9VVENTdHJpbmc/CmI9Yy5leHBpcmVzLnRvVVRDU3RyaW5nKCk6Im51bWJlciI9PT10eXBlb2YgYy5leHBpcmVzJiYoYj0obmV3IERhdGUoRGF0ZS5ub3coKSsxRTMqYy5leHBpcmVzKSkudG9VVENTdHJpbmcoKSksaC5wdXNoKCI7ZXhwaXJlc1x4M2QiK2IpKTtkb2N1bWVudC5jb29raWU9ZysiXHgzZCIraytoLmpvaW4oIiIpfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtdXRpbCIsInBydjphLWNvb2tpZS13cml0ZXIiLCJwcnY6YS1iaXQtYXJyYXkiLCJhLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNvb2tpZS1oaW50IixmdW5jdGlvbihkLGcsayxjKXtmdW5jdGlvbiBoKGIpe3JldHVybiBmdW5jdGlvbihjKXtnKGIsbi5idG9hKGMudG9TdHJpbmcoKSkse3BhdGg6Ii8iLGV4cGlyZXM6MzE1MzZFM30pfX1mdW5jdGlvbiBiKGIsYyl7dmFyIGE9OCpiLmJ5dGVMZW5ndGgoKS0xNjtyZXR1cm57c2V0OmQucmVzdChmdW5jdGlvbihlKXtkLmVhY2goZSxmdW5jdGlvbihjKXtjPj1hfHxiLnNldChjLDIpfSk7CmMoYik7cmV0dXJuIHRoaXN9KX19aWYoIW4uYnRvYXx8IW4uYXRvYilyZXR1cm57Z2V0OmMuY29uc3RhbnRzLk5PT1B9O3ZhciBlPXtzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LG09e307cmV0dXJue2dldDpmdW5jdGlvbihjLGcpe2lmKCFtW2NdKXt2YXIgYT1nfHwxMjA7Zz1oKGMpO3ZhciBxPWQuY29va2llcy5nZXQoYyl8fCIwIixmO2I6e2lmKCEoND5xLmxlbmd0aCkpdHJ5e3ZhciBsPW4uYXRvYihxKTtpZigwIT09bC5sZW5ndGgmJigxIT09bC5sZW5ndGh8fDAhPT1sLmNoYXJDb2RlQXQoMCkpKXtmPWsuZnJvbVN0cmluZyhsKTticmVhayBifX1jYXRjaCh4KXt9Zj12b2lkIDB9Znx8KGE9ay5jcmVhdGUoMTYrYSksZj1uZXcgRGF0ZSxsPW5ldyBEYXRlKGYuZ2V0RnVsbFllYXIoKSwwLDApLGY9TWF0aC5mbG9vcigoZi1sKS84NjRFNSkvMj4+MCxhLnNldEJ5dGUoMCwwKSxhLnNldEJ5dGUoZiwxKSxnKGEpLGY9YSk7YT1mO2c9MD49KGEuZ2V0Qnl0ZSgwKSY2Myk/YihhLApnKTplO21bY109Z31yZXR1cm4gbVtjXX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiQSIpLnJlZ2lzdGVyKCJhLWNvbXBvbmVudC1taXhpbnMiLGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGcoaCl7Zm9yKHZhciBiPTA7YjxoLmxlbmd0aDtiKyspaWYoMD5kLmluZGV4T2ZBcnJheShjLGhbYl0pKXJldHVybiExO3JldHVybiEwfXZhciBrPTAsYz1kLmNvbnN0YW50cy5kZWNsYXJhdGl2ZUV2ZW50cy5zcGxpdCgiICIpO3JldHVybntzaG93OmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImEtaGlkZGVuIGFvay1oaWRkZW4iKS5zaG93KCk7cmV0dXJuIHRoaXN9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5hZGRDbGFzcygiYW9rLWhpZGRlbiIpO3JldHVybiB0aGlzfSx0b2dnbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fJGVsZW1lbnQuaGFzQ2xhc3MoImFvay1oaWRkZW4iKT90aGlzLnNob3coKTp0aGlzLmhpZGUoKX0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8kZWxlbWVudC5zaXplKCl9LAppc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl8kZWxlbWVudC5zaXplKCl9LG9uOmZ1bmN0aW9uKGMsYil7dmFyIGU9ZC5wYXJzZUZ1bmN0aW9uTmFtZShiKTtlfHxtLmVycm9yLmNhbGwoe30sIlBsZWFzZSBuYW1lIGFsbCBhc3luY2hyb25vdXMgZXZlbnQgY2FsbGJhY2tzIik7aWYoYz1jP2Muc3BsaXQoIiAiKTp2b2lkIDApe3RoaXMuZm5NYXA9dGhpcy5mbk1hcHx8e307ZyhjKXx8bS5lcnJvci5jYWxsKHt9LCJUaGF0IGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQhIik7dmFyIHA9dGhpcztkLmVhY2goYyxmdW5jdGlvbihjKXt0aGlzLmZuTWFwW2NdPXRoaXMuZm5NYXBbY118fFtdO3ZhciBoPXRoaXMuZm5NYXBbY11bYl09ImEtY29tcG9uZW50LWV2ZW50LSIraysrO2QuZGVjbGFyYXRpdmUoaCxjLGZ1bmN0aW9uKCl7dHJ5e2IuYXBwbHkocCxwLmNhbGxiYWNrQXJnc3x8W10pfWNhdGNoKGEpe20ubG9nRXJyb3IuY2FsbCh7fSxhLCJFcnJvciBvY2N1cnJlZCBpbiBhbiBhc3luY2hyb25vdXMgZXZlbnQgY2FsbGJhY2siLAoiRkFUQUwiLChiLmNhbGxlcnx8IiIpK2MrImhhbmRsZXI6IisoZXx8ImFub255bW91cyIpKX19KTtkLmRlY2xhcmF0aXZlLmNyZWF0ZShwLl8kZWxlbWVudCxoKX0scCl9fSxvZmY6ZnVuY3Rpb24oYyxiKXtjPWM/Yy5zcGxpdCgiICIpOnZvaWQgMDt0aGlzLmZuTWFwfHxtLmVycm9yLmNhbGwoe30sIlRoZXJlIGFyZSBubyBjYWxsYmFja3MgYXNzaWduZWQgdG8gdGhpcyBjb21wb25lbnQiKTtjJiZiP2QuZWFjaChjLGZ1bmN0aW9uKGMpe3RyeXtkLmRlY2xhcmF0aXZlLnJlbW92ZSh0aGlzLl8kZWxlbWVudCx0aGlzLmZuTWFwW2NdW2JdKSxkZWxldGUgdGhpcy5mbk1hcFtjXVtiXX1jYXRjaChoKXttLmVycm9yLmNhbGwoe30sIlRoZSBjb21wb25lbnQgaXMgbm90IGJvdW5kIHRvIGEgY2FsbGJhY2sgd2l0aCBuYW1lICIrZC5wYXJzZUZ1bmN0aW9uTmFtZShiKXx8ImFub255bW91cyBmb3IgZXZlbnQgIitjKX19LHRoaXMpOmJ8fGM/IWImJmM/ZC5lYWNoKGMsZnVuY3Rpb24oYil7Zm9yKHZhciBjIGluIHRoaXMuZm5NYXBbYl0pdGhpcy5mbk1hcFtiXS5oYXNPd25Qcm9wZXJ0eShjKSYmCnRoaXMub2ZmKGIsYyk7ZGVsZXRlIHRoaXMuZm5NYXBbYl19LHRoaXMpOm0uZXJyb3IuY2FsbCh7fSwiUGxlYXNlIHByb3ZpZGUgYW4gZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsYmFjayIpOihkLmRlY2xhcmF0aXZlLnJlbW92ZSh0aGlzLl8kZWxlbWVudCksZGVsZXRlIHRoaXMuZm5NYXApfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsYil7dGhpcy5jYWxsYmFja0FyZ3M9Ynx8W107ZC4kLmZuLnRyaWdnZXIuY2FsbCh0aGlzLl8kZWxlbWVudCxjKX19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiQSIsImEtY29tcG9uZW50LW1peGlucyIsImEtYW5hbHl0aWNzIiwicHJ2OmEtc2FtcGxlciIpLnJlZ2lzdGVyKCJhLWNvbXBvbmVudCIsZnVuY3Rpb24oZCxnLGssYyl7dmFyIGg9ZC5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihiLGMpe2QuY29udGFpbnMoYiwiLmEtIikmJm0uZXJyb3IoIntBUEl9IENhbm5vdCBjcmVhdGUgY29tcG9uZW50cyB1c2luZyAnYS0nIHNlbGVjdG9ycy4gQXBwbHkgeW91ciBvd24gQ1NTIGNsYXNzIG9yIElEIHRvIHNlbGVjdCB0aGlzIGVsZW1lbnQuIiwKIkFQSSIsImNvbXBvbmVudCIpO3RoaXMuXyRlbGVtZW50PWQuJChiLGMpO3RoaXMuX3RyYWNrQXBpKCl9LF90cmFja0FwaTpmdW5jdGlvbigpe3RoaXMuX2NvbXBvbmVudE5hbWUmJmMoIkFVSSBBUEkgQW5hbHl0aWNzIikmJmsuaW5jcmVtZW50KCJhcGk6Iit0aGlzLl9jb21wb25lbnROYW1lKX19KTtyZXR1cm57Y3JlYXRlOmZ1bmN0aW9uKGIpe3ZhciBjPWIubWl4aW47YyYmZGVsZXRlIGIubWl4aW47Yj1oLmV4dGVuZChiKTtjJiZkLm1peGluKGIucHJvdG90eXBlLGcsYyk7cmV0dXJuIGJ9fX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiLCJhLWNvbXBvbmVudCIpLnJlZ2lzdGVyKCJhLWFsZXJ0IixmdW5jdGlvbihkLGcpe3ZhciBrPWQuJCxjPVsiZXJyb3IiLCJzdWNjZXNzIiwid2FybmluZyIsImluZm8iXSxoPWQubWFwKGMsZnVuY3Rpb24oYil7cmV0dXJuImEtYWxlcnQtIitifSkuam9pbigiICIpLGI9ZC5tYXAoYyxmdW5jdGlvbihiKXtyZXR1cm4iYS1hbGVydC1pbmxpbmUtIisKYn0pLmpvaW4oIiAiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImg0Iik7ZS5jbGFzc05hbWU9ImEtYWxlcnQtaGVhZGluZyI7dmFyIHA9ayhlKSxuPWcuY3JlYXRlKHtfY29tcG9uZW50TmFtZToiYWxlcnQiLGluaXQ6ZnVuY3Rpb24oYixhKXt0aGlzLl9zdXBlcihiLGEpO3RoaXMuXyRlbGVtZW50PXRoaXMuXyRlbGVtZW50LmZpbHRlcigiLmEtYWxlcnQsIC5hLWFsZXJ0LWlubGluZSIpO3RoaXMuXyRoZWFkaW5nPXRoaXMuXyRlbGVtZW50LmZpbmQoIi5hLWFsZXJ0LWhlYWRpbmciKTt0aGlzLl8kY29udGVudD10aGlzLl8kZWxlbWVudC5maW5kKCIuYS1hbGVydC1jb250ZW50Iil9LG1peGluOlsic2hvdyIsImhpZGUiLCJzaXplIiwiaXNFbXB0eSJdLGhlYWRpbmc6ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYilyZXR1cm4gdGhpcy5fJGhlYWRpbmcudGV4dCgpO3RoaXMuXyRoZWFkaW5nLmxlbmd0aD90aGlzLl8kaGVhZGluZy50ZXh0KGIpOnRoaXMuXyRoZWFkaW5nPQpwLmNsb25lKCkudGV4dChiKS5pbnNlcnRCZWZvcmUodGhpcy5fJGNvbnRlbnQpO3JldHVybiB0aGlzfSxyZW1vdmVIZWFkaW5nOmZ1bmN0aW9uKCl7dGhpcy5fJGhlYWRpbmcucmVtb3ZlKCk7dGhpcy5fJGhlYWRpbmc9aygpO3JldHVybiB0aGlzfSx0ZXh0OmZ1bmN0aW9uKGIpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGIpcmV0dXJuIHRoaXMuXyRjb250ZW50LnRleHQoKTt0aGlzLl8kY29udGVudC50ZXh0KGIpO3JldHVybiB0aGlzfSxodG1sOmZ1bmN0aW9uKGIpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGIpcmV0dXJuIHRoaXMuXyRjb250ZW50Lmh0bWwoKTt0aGlzLl8kY29udGVudC5odG1sKGIpO3JldHVybiB0aGlzfSx0eXBlOmZ1bmN0aW9uKGUpey0xPT09ZC5pbmRleE9mQXJyYXkoYyxlKSYmbS5lcnJvcigie0FQSX0gQWxlcnQgdHlwZSBtdXN0IGJlIG9uZSBvZiBbZXJyb3IsIHN1Y2Nlc3MsIHdhcm5pbmcsIGluZm9dLiIsIkFQSSIsImFsZXJ0Iik7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbihhLApjKXthPWsoYyk7Yz0iYS1hbGVydC0iO2EuaGFzQ2xhc3MoImEtYWxlcnQtaW5saW5lIik/KGMrPSJpbmxpbmUtIixhLnJlbW92ZUNsYXNzKGIpKTphLnJlbW92ZUNsYXNzKGgpO2EuYWRkQ2xhc3MoYytlKX0pO3JldHVybiB0aGlzfX0pO3JldHVybiBmdW5jdGlvbihiLGEpe3JldHVybiBuZXcgbihiLGEpfX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiLCJhLWNvbXBvbmVudCIsImEtZm9ybS1jb250cm9scy1hcGkiKS5yZWdpc3RlcigiYS1jaGVja2JveCIsZnVuY3Rpb24oZCxnLGspe3ZhciBjPWQuJCxoPWsuc2V0Q2hlY2tib3hTdGF0ZSxiPWcuY3JlYXRlKHtfY29tcG9uZW50TmFtZToiY2hlY2tib3giLGluaXQ6ZnVuY3Rpb24oYixjKXt0aGlzLl9zdXBlcihiLGMpO3RoaXMuXyRlbGVtZW50PXRoaXMuXyRlbGVtZW50LmNsb3Nlc3QoIi5hLWNoZWNrYm94Iik7dGhpcy5fJGlucHV0PXRoaXMuXyRlbGVtZW50LmZpbmQoIlt0eXBlXHgzZGNoZWNrYm94XSIpfSxtaXhpbjpbInNob3ciLAoiaGlkZSIsInNpemUiLCJpc0VtcHR5Il0sY2hlY2s6ZnVuY3Rpb24oYil7Yj12b2lkIDA9PT1iPyEwOmI7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbigpe2godGhpcyxiKX0pO3JldHVybiB0aGlzfSx1bmNoZWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hlY2soITEpfSx0b2dnbGVDaGVja2VkOmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbigpe2sudG9nZ2xlQ2hlY2tib3hTdGF0ZSh0aGlzKX0pO3JldHVybiB0aGlzfSxpc0NoZWNrZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPXRoaXMuXyRpbnB1dC5sZW5ndGg7YjxjO2IrKylpZighdGhpcy5fJGlucHV0W2JdLmNoZWNrZWQpcmV0dXJuITE7cmV0dXJuITB9LGlzVW5jaGVja2VkOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsYz10aGlzLl8kaW5wdXQubGVuZ3RoO2I8YztiKyspaWYodGhpcy5fJGlucHV0W2JdLmNoZWNrZWQpcmV0dXJuITE7cmV0dXJuITB9LGVuYWJsZTpmdW5jdGlvbihiKXtiPXZvaWQgMD09PQpiPyEwOmI7dGhpcy5fJGVsZW1lbnQuZWFjaChmdW5jdGlvbigpe2godGhpcyx2b2lkIDAsIWIpfSk7cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGUoITEpfSx0b2dnbGVFbmFibGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsYz10aGlzLl8kaW5wdXQubGVuZ3RoO2I8YztiKyspaCh0aGlzLl8kZWxlbWVudFtiXSx2b2lkIDAsIXRoaXMuXyRpbnB1dFtiXS5kaXNhYmxlZCk7cmV0dXJuIHRoaXN9LGlzRW5hYmxlZDpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGM9dGhpcy5fJGlucHV0Lmxlbmd0aDtiPGM7YisrKWlmKHRoaXMuXyRpbnB1dFtiXS5kaXNhYmxlZClyZXR1cm4hMTtyZXR1cm4hMH0saXNEaXNhYmxlZDpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGM9dGhpcy5fJGlucHV0Lmxlbmd0aDtiPGM7YisrKWlmKCF0aGlzLl8kaW5wdXRbYl0uZGlzYWJsZWQpcmV0dXJuITE7cmV0dXJuITB9LHRvZ2dsZTpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYiYmKGI9ISFiKTt0aGlzLl8kZWxlbWVudC5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS50b2dnbGUoYil9KTtyZXR1cm4gdGhpc319KTtyZXR1cm4gZnVuY3Rpb24oYyxkKXtyZXR1cm4gbmV3IGIoYyxkKX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJBIiwiYS1jb21wb25lbnQiKS5yZWdpc3RlcigiYS1tZXRlciIsZnVuY3Rpb24oZCxnKXt2YXIgaz1nLmNyZWF0ZSh7X2NvbXBvbmVudE5hbWU6Im1ldGVyIixpbml0OmZ1bmN0aW9uKGMsZCl7dGhpcy5fc3VwZXIoYyxkKTt0aGlzLl8kZWxlbWVudD10aGlzLl8kZWxlbWVudC5maWx0ZXIoIi5hLW1ldGVyLCAuYS1tZXRlci13aXRoLXR4dCIpO3RoaXMuXyRiYXI9dGhpcy5fJGVsZW1lbnQuZmluZCgiLmEtbWV0ZXItYmFyIik7dGhpcy5fJHByb2dyZXNzVHh0PXRoaXMuXyRlbGVtZW50LmZpbmQoIi5hLW1ldGVyLXByb2dyZXNzLXR4dCIpfSxtaXhpbjpbInNob3ciLCJoaWRlIiwic2l6ZSIsImlzRW1wdHkiXSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57cGVyY2VudDp0aGlzLnBlcmNlbnQoKSwKdHh0OnRoaXMudGV4dCgpfX0sZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImEtaW5hY3RpdmUiKTtyZXR1cm4gdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuXyRlbGVtZW50LmFkZENsYXNzKCJhLWluYWN0aXZlIik7cmV0dXJuIHRoaXN9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiF0aGlzLl8kZWxlbWVudC5oYXNDbGFzcygiYS1pbmFjdGl2ZSIpfSxwZXJjZW50OmZ1bmN0aW9uKGMpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGMpcmV0dXJuIGM9dGhpcy5fJGJhci5nZXQoMCkuc3R5bGUud2lkdGgscGFyc2VJbnQoYywxMCk7ZC5pc0Zpbml0ZU51bWJlcihjKXx8bS5lcnJvcigie0FQSX0gIE1ldGVyIHBlcmNlbnQgc2hvdWxkIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwIiwiYS1tZXRlciIsInNldFByb2dyZXNzIik7Yz1NYXRoLm1pbigxMDAsTWF0aC5tYXgoMCxjKSk7Yys9IiUiO3RoaXMuXyRiYXIuY3NzKHt3aWR0aDpjfSk7CnRoaXMuXyRlbGVtZW50LmF0dHIoImFyaWEtbGFiZWwiLGMpO3JldHVybiB0aGlzfSx0ZXh0OmZ1bmN0aW9uKGMpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGMpcmV0dXJuIHRoaXMuXyRwcm9ncmVzc1R4dC50ZXh0KCk7dGhpcy5fJHByb2dyZXNzVHh0LnRleHQoYyk7cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihjLGQpe3RoaXMucGVyY2VudChjKTtkJiZ0aGlzLnRleHQoZCk7cmV0dXJuIHRoaXN9fSk7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7cmV0dXJuIG5ldyBrKGMsZCl9fSk7bS53aGVuKCJhLWNvbXBvbmVudCIpLnJlZ2lzdGVyKCJhLXNwaW5uZXIiLGZ1bmN0aW9uKGQpe3ZhciBnPWQuY3JlYXRlKHtfY29tcG9uZW50TmFtZToic3Bpbm5lciIsaW5pdDpmdW5jdGlvbihkLGMpe3RoaXMuX3N1cGVyKGQsYyk7dGhpcy5fJGVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuZmlsdGVyKCIuYS1zcGlubmVyLXdyYXBwZXIsIC5hLXNwaW5uZXIiKX0sbWl4aW46WyJzaG93IiwiaGlkZSIsImlzRW1wdHkiLAoic2l6ZSJdLHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuXyRlbGVtZW50LnJlbW92ZSgpfX0pO3JldHVybiBmdW5jdGlvbihkLGMpe3JldHVybiBuZXcgZyhkLGMpfX0pOyJ1c2Ugc3RyaWN0IjttLnJlZ2lzdGVyKCJhLXVhIixmdW5jdGlvbigpe3JldHVybntjb21wYXJlVmVyc2lvbnM6ZnVuY3Rpb24oZCxnLGspe3ZhciBjPWZ1bmN0aW9uKGIpe20uZXJyb3IoIlZlcnNpb25zIGFyZSBub3QgY29tcGFyYWJsZS4gIitiLCJBIC0gZXh0cmFzIiwiY29tcGFyZVZlcnNpb25zIil9O2s9a3x8Ii4iOyJzdHJpbmciPT09dHlwZW9mIGQmJiJzdHJpbmciPT09dHlwZW9mIGcmJiJzdHJpbmciPT09dHlwZW9mIGsmJiIiIT09ZCYmIiIhPT1nfHxjKCJJbnB1dCB2YWx1ZXMgYXJlIG5vdCB2YWxpZC4iKTtkPWQuc3BsaXQoayk7Zz1nLnNwbGl0KGspO2s9TWF0aC5tYXgoZC5sZW5ndGgsZy5sZW5ndGgpO2Zvcih2YXIgaD0wO2g8aztoKyspe3ZhciBiPWg8ZC5sZW5ndGg/TnVtYmVyKGRbaF0pOjAsZT0KaDxnLmxlbmd0aD9OdW1iZXIoZ1toXSk6MDshaXNOYU4oYikmJmlzRmluaXRlKGIpJiYhaXNOYU4oZSkmJmlzRmluaXRlKGUpfHxjKCJQaWVjZSBvZiBvbmUgdmVyc2lvbiBudW1iZXIgZXZhbHVhdGVzIHRvIE5hTiBvciArLy0gSW5maW5pdHkuIik7aWYoYjxlKXJldHVybi0xO2lmKGI+ZSlyZXR1cm4gMX1yZXR1cm4gMH19fSk7InVzZSBzdHJpY3QiO20ud2hlbigiYS1iYXNlIiwiYS11dGlsIiwiYS1hbmFseXRpY3MiLCJhZnRlckxvYWQiKS5leGVjdXRlKCJhLXRlbXBsYXRlLWVycm9ycyIsZnVuY3Rpb24oZCxnLGspe3ZhciBjPWQuJCxoPXt9OyhmdW5jdGlvbigpe2MoIi5hLXRlbXBsYXRlLWVycm9ycyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1jKHRoaXMpOyhiPWIuZGF0YSgidGVtcGxhdGUtZXJyb3JzIil8fGIuZmluZCgiW2RhdGEtdGVtcGxhdGUtZXJyb3JzXSIpLmRhdGEoInRlbXBsYXRlLWVycm9ycyIpKSYmMDxiLmxlbmd0aCYmZy5lYWNoKGIsZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI6Iikuc2xpY2UoMCwKMykuam9pbigiOiIpO2hbYl18fChoW2JdPTApO2hbYl0rPTF9KX0pfSkoKTsoZnVuY3Rpb24oKXtnLmVhY2goaCxmdW5jdGlvbihiLGMpe3ZhciBkPWMuc3BsaXQoIjoiKTtiPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coYikvTWF0aC5sb2coMTApKSk7ay5sb2dFcnJvcihkWzFdKyIgYXR0cmlidXRlIGZhaWxlZCAiK2RbMl0rIiBpbiAiK2RbMF0rIiB0ZW1wbGF0ZS4gVGhpcyBlcnJvciBpcyB0aHJvd24gYmV0d2VlbiAiK2IrIiBhbmQgIisxMCpiKyIgbnVtYmVyIG9mIHRpbWVzIG9uIHRoZSBwYWdlLiIsIkVSUk9SIixjKX0pfSkoKX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oImEtYW5hbHl0aWNzIiwicHJ2OnAtZGVidWciLCJyZWFkeSIpLmV4ZWN1dGUoZnVuY3Rpb24oZCxnKXttLmRlY2xhcmUoInBydjphLWxvZ1RyaWdnZXIiLGZ1bmN0aW9uKGspe3ZhciBjPWdba10mJmdba10ucmVnaXN0ZXJlZHx8MCxoPTAsYj0wLGU7Zm9yKGUgaW4gZylpZihnLmhhc093blByb3BlcnR5KGUpKXt2YXIgbT0KZ1tlXTttLmVuZCYmbS5lbmQ8PWMmJihoKyssYis9bS5lbmQtbS5zdGFydCl9ZC5jb3VudCgiYmxvY2tpbmctY291bnQ6IitrLGgpO2QuY291bnQoImJsb2NraW5nLXRpbWU6IitrLE1hdGgucm91bmQoYikpfSl9KTsidXNlIHN0cmljdCI7bS53aGVuKCJqUXVlcnkiLCJhLWFuYWx5dGljcyIsImxvYWQiKS5yZWdpc3RlcigiYS11bmljb2RlLXJ1cGVlLXRlc3QiLGZ1bmN0aW9uKGQsZyl7dmFyIGs9ZCgiXHgzY2Rpdi9ceDNlIiksYz1kKCJceDNjc3Bhbi9ceDNlIikuaHRtbCgiXHgyNiM2NTUzNDsiKTtkPWQoIlx4M2NzcGFuL1x4M2UiKS5odG1sKCJceDI2IzgzNzc7Iik7ay5hcHBlbmQoYyxkKTtrLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO2Q9ZC53aWR0aCgpO2M9Yy53aWR0aCgpO2Q9PT1jP2cuaW5jcmVtZW50KCJhdWktdW5zdXBwb3J0ZWQtcnVwZWUiLDEpOmcuaW5jcmVtZW50KCJhdWktc3VwcG9ydGVkLXJ1cGVlIiwxKTtrLnJlbW92ZSgpfSk7InVzZSBzdHJpY3QiO20ucmVnaXN0ZXIoInBydjphLXNhbXBsZXItaW5jbHVzaW9uIiwKZnVuY3Rpb24oKXtyZXR1cm57IkFVSSBBUEkgQW5hbHl0aWNzIjouMDE+TWF0aC5yYW5kb20oKX19KTttLndoZW4oInBydjphLXNhbXBsZXItaW5jbHVzaW9uIikucmVnaXN0ZXIoInBydjphLXNhbXBsZXIiLGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihnKXtyZXR1cm4gZC5oYXNPd25Qcm9wZXJ0eShnKSYmZFtnXX19KTsidXNlIHN0cmljdCI7bS53aGVuKCJBIiwibG9hZCIpLmV4ZWN1dGUoImEtZW1iZXIiLGZ1bmN0aW9uKGQpeyFkLmNhcGFiaWxpdGllcy5pc1VDQnJvd3NlciYmZC5sb2NhbFN0b3JhZ2UmJiJhLWVtYmVyIiE9PWQubG9jYWxTdG9yYWdlLmdldEl0ZW0oImEtZm9udC1jbGFzcyIpJiZtLndoZW4oImEtZm9udHMiKS5leGVjdXRlKCJhLWVtYmVyLWxvYWRlciIsZnVuY3Rpb24oZyl7Zy5sb2FkKCIxZW0gQW1hem9uIEVtYmVyIik7Zy5sb2FkKCJib2xkIDFlbSBBbWF6b24gRW1iZXIiKTtnLmxvYWQoIml0YWxpYyAxZW0gQW1hem9uIEVtYmVyIik7Zy5sb2FkKCJpdGFsaWMgYm9sZCAxZW0gQW1hem9uIEVtYmVyIik7CmcucmVhZHkudGhlbihmdW5jdGlvbihnKXtkLmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhLWZvbnQtY2xhc3MiLCJhLWVtYmVyIil9KX0pfSk7InVzZSBzdHJpY3QiO20ud2hlbigibG9hZCIpLnJlZ2lzdGVyKCJhLXBjdiIsZnVuY3Rpb24oKXt2YXIgZD0obi5wY3Z8fHt9KS5BbWF6b25VSTtkJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLWF1aS12ZXJzaW9uIixkKX0pOyJ1c2Ugc3RyaWN0IjttLndoZW4oIkEiLCJhLWFuYWx5dGljcyIpLnJlZ2lzdGVyKCJwcnY6YS1hc3NldC10cmFuc2ZlciIsZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBrKGIsYyxkKXtyZXR1cm4oYj1iLmV4ZWMoYykpJiYyPD1iLmxlbmd0aD9iWzFdOmR8fCIifWZ1bmN0aW9uIGMoKXtyZXR1cm4gZC5maWx0ZXIobi5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzKHtlbnRyeVR5cGU6InJlc291cmNlIn0pLGZ1bmN0aW9uKGIpe3JldHVybigibGluayI9PT1iLmluaXRpYXRvclR5cGV8fCJzY3JpcHQiPT09CmIuaW5pdGlhdG9yVHlwZSkmJmIubmFtZSYmMDxiLm5hbWUuaW5kZXhPZigiQVVJQ2xpZW50cy9BbWF6b25VSSIpfSl9dmFyIGg9L0FVSUNsaWVudHNcLyguKj8oPz0oPzojKXwkKSkvLGI9biYmbi5wZXJmb3JtYW5jZSYmbi5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzJiYiZnVuY3Rpb24iPT09dHlwZW9mIG4ucGVyZm9ybWFuY2UuZ2V0RW50cmllcztyZXR1cm4gZnVuY3Rpb24oKXtiJiZkLmVhY2goYygpLGZ1bmN0aW9uKGIpe3ZhciBjO2M9W2IuaW5pdGlhdG9yVHlwZSxrKGgsYi5uYW1lfHwiIildLmpvaW4oIjoiKTtnLmNvdW50KGMrIjpzdGFydFRpbWUiLGIuc3RhcnRUaW1lfHwwKTtnLmNvdW50KGMrIjpyZXNwb25zZUVuZCIsYi5yZXNwb25zZUVuZHx8MCl9KX19KTttLndoZW4oInBydjphLWFzc2V0LXRyYW5zZmVyIikuZXhlY3V0ZSgiYS1hc3NldC10cmFuc2Zlci10aW1lIixmdW5jdGlvbihkKXsuMDU+TWF0aC5yYW5kb20oKSYmZCgpfSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGMpe3ZhciBmPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsaD1mLl9uYW1lc3BhY2V8fGYuYXR0cmlidXRlRXJyb3JzLGQ9aD9oKCJBbWF6b25VSUJ1dHRvbiIsIkFtYXpvblVJIik6ZjtkLmd1YXJkRmF0YWw/ZC5ndWFyZEZhdGFsKGMpKGQsd2luZG93KTpkLmV4ZWN1dGUoZnVuY3Rpb24oKXtjKGQsd2luZG93KX0pfSkoZnVuY3Rpb24oYyxmLGgpe2Mud2hlbigiQSIsImEtY29tcG9uZW50IikucmVnaXN0ZXIoImEtYnV0dG9uIixmdW5jdGlvbihkLGwpe2Z1bmN0aW9uIGUoYSl7YS5wcmV2ZW50RGVmYXVsdCgpfXZhciBnPWwuY3JlYXRlKHtfY29tcG9uZW50TmFtZToiYnV0dG9uIixpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fc3VwZXIoYSxiKTt0aGlzLl8kZWxlbWVudD10aGlzLl8kZWxlbWVudC5maWx0ZXIoIi5hLWJ1dHRvbiIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuY2hpbGRyZW4oIi5hLWJ1dHRvbi1pbm5lciIpLmNoaWxkcmVuKCJidXR0b24saW5wdXQiKTsKdGhpcy5fJGNvcmVMaW5rRWxlbWVudD10aGlzLl8kZWxlbWVudC5jaGlsZHJlbigiLmEtYnV0dG9uLWlubmVyIikuY2hpbGRyZW4oImEiKTt0aGlzLl8kY29udGVudEVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuZmluZCgiLmEtYnV0dG9uLXRleHQiKX0sbWl4aW46InNob3cgaGlkZSB0b2dnbGUgaXNFbXB0eSBzaXplIG9uIG9mZiB0cmlnZ2VyIi5zcGxpdCgiICIpLGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuXyRlbGVtZW50LnJlbW92ZUNsYXNzKCJhLWJ1dHRvbi1kaXNhYmxlZCIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQucHJvcCgiZGlzYWJsZWQiLCExKTt0aGlzLl8kY29yZUxpbmtFbGVtZW50LnVuYmluZCgiY2xpY2siLGUpO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fJGVsZW1lbnQuYWRkQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIikucmVtb3ZlQ2xhc3MoImEtYnV0dG9uLWZvY3VzIik7dGhpcy5fJGNvcmVGb3JtRWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsCiEwKTt0aGlzLl8kY29yZUxpbmtFbGVtZW50LmNsaWNrKGUpO3JldHVybiB0aGlzfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fJGVsZW1lbnQuaGFzQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIil9LHNldFN0YXR1czpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl8kZWxlbWVudCxlPVtudWxsLCJub3JtYWwiLCJzZWxlY3RlZCIsImRpc2FibGVkIiwiZXJyb3IiLCJpbmFjdGl2ZSJdLGs9MD5kLmluZGV4T2ZBcnJheShlLGEpLG09InJhZGlvIj09PWIuYXR0cigicm9sZSIpO2lmKGspcmV0dXJuIGMuZXJyb3IoYSsiIGlzIG5vdCBhIHZhbGlkIHN0YXR1cyIpLCExO2QuZWFjaChlLGZ1bmN0aW9uKGEpe2IucmVtb3ZlQ2xhc3MoImEtYnV0dG9uLSIrYSl9KTt0aGlzLl8kY29yZUZvcm1FbGVtZW50LnByb3AoImRpc2FibGVkIiwiZGlzYWJsZWQiPT09YSk7Yi5hdHRyKCJhcmlhLWNoZWNrZWQiLGZ1bmN0aW9uKGIsayl7cmV0dXJuIG0/InNlbGVjdGVkIj09PWE6a30pO251bGwhPT0KYSYmYi5hZGRDbGFzcygiYS1idXR0b24tIithKTtyZXR1cm4gdGhpc30sdGV4dDpmdW5jdGlvbihhKXtpZighKDE+dGhpcy5fJGNvbnRlbnRFbGVtZW50Lmxlbmd0aCkpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGEpcmV0dXJuIHRoaXMuXyRjb250ZW50RWxlbWVudC50ZXh0KCk7dGhpcy5fJGNvbnRlbnRFbGVtZW50LnRleHQoYSk7cmV0dXJuIHRoaXN9fX0pO3JldHVybiBmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZyhhLGIpfX0pOyJ1c2Ugc3RyaWN0IjtjLndoZW4oIkEiLCJhLWNvbXBvbmVudCIpLnJlZ2lzdGVyKCJhLXRvZ2dsZS1idXR0b24iLGZ1bmN0aW9uKGQsYyl7ZnVuY3Rpb24gZShhKXthLnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gZyhhKXtkLmVhY2goYixmdW5jdGlvbihiKXthLl8kZWxlbWVudC5yZW1vdmVDbGFzcyhiKX0sYSl9ZnVuY3Rpb24gYShhKXtyZXR1cm4gMD09PWEuXyRlbGVtZW50Lmxlbmd0aHx8MD09PWEuXyRjb3JlRm9ybUVsZW1lbnQubGVuZ3RofQp2YXIgYj1bImEtYnV0dG9uLXNlbGVjdGVkIiwiYS1idXR0b24tZm9jdXMiXSxmPWMuY3JlYXRlKHtfY29tcG9uZW50TmFtZToidG9nZ2xlQnV0dG9uIixpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fc3VwZXIoYSxiKTt0aGlzLl8kZWxlbWVudD10aGlzLl8kZWxlbWVudC5maWx0ZXIoIi5hLWJ1dHRvbiIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQ9dGhpcy5fJGVsZW1lbnQuZmluZCgiLmEtYnV0dG9uLWlubmVyIikuZmluZCgiYnV0dG9uLGlucHV0Iik7dGhpcy5fJGNvcmVMaW5rRWxlbWVudD10aGlzLl8kZWxlbWVudC5maW5kKCIuYS1idXR0b24taW5uZXIgYSIpfSxuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXyRjb3JlRm9ybUVsZW1lbnQuYXR0cigibmFtZSIpfSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5yZW1vdmVDbGFzcygiYS1idXR0b24tZGlzYWJsZWQiKTt0aGlzLl8kY29yZUZvcm1FbGVtZW50LnByb3AoImRpc2FibGVkIiwhMSk7dGhpcy5fJGNvcmVMaW5rRWxlbWVudC51bmJpbmQoImNsaWNrIiwKZSk7cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtnKHRoaXMpO3RoaXMuXyRlbGVtZW50LmFkZENsYXNzKCJhLWJ1dHRvbi1kaXNhYmxlZCIpO3RoaXMuXyRjb3JlRm9ybUVsZW1lbnQucHJvcCgiZGlzYWJsZWQiLCEwKTt0aGlzLl8kY29yZUxpbmtFbGVtZW50LmNsaWNrKGUpO3JldHVybiB0aGlzfSxzZXRBdmFpbGFibGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5yZW1vdmVDbGFzcygiYS1idXR0b24tdW5hdmFpbGFibGUiKTtyZXR1cm4gdGhpc30sc2V0VW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt0aGlzLl8kZWxlbWVudC5hZGRDbGFzcygiYS1idXR0b24tdW5hdmFpbGFibGUiKTtyZXR1cm4gdGhpc30saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWEodGhpcykmJiF0aGlzLl8kZWxlbWVudC5oYXNDbGFzcygiYS1idXR0b24tZGlzYWJsZWQiKX0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oKXshYSh0aGlzKSYmdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5fJGVsZW1lbnQuYWRkQ2xhc3MoImEtYnV0dG9uLXNlbGVjdGVkIGEtYnV0dG9uLWZvY3VzIikuYXR0cigiYXJpYS1jaGVja2VkIiwKInRydWUiKTtyZXR1cm4gdGhpc30sc2V0VW5zZWxlY3RlZDpmdW5jdGlvbigpe2codGhpcyk7cmV0dXJuIHRoaXN9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hYSh0aGlzKSYmdGhpcy5fJGVsZW1lbnQuaGFzQ2xhc3MoImEtYnV0dG9uLXNlbGVjdGVkIil9LGlzQXZhaWxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIWEodGhpcykmJiF0aGlzLl8kZWxlbWVudC5oYXNDbGFzcygiYS1idXR0b24tdW5hdmFpbGFibGUiKX19KTtyZXR1cm4gZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGYoYSxiKX19KTsidXNlIHN0cmljdCI7Yy53aGVuKCJBIiwiYS1jb21wb25lbnQiLCJhLXRvZ2dsZS1idXR0b24iKS5yZWdpc3RlcigiYS10b2dnbGUtYnV0dG9uLWdyb3VwIixmdW5jdGlvbihkLGMsZSl7dmFyIGY9Yy5jcmVhdGUoe19jb21wb25lbnROYW1lOiJ0b2dnbGVCdXR0b25Hcm91cCIsaW5pdDpmdW5jdGlvbihhLGIpe3RoaXMuX3N1cGVyKGEsYik7dGhpcy5fJHRvZ2dsZUdyb3VwRWxlbWVudD0KdGhpcy5fJGVsZW1lbnQuZmlsdGVyKCIuYS1idXR0b24tZ3JvdXAsIC5hLWJ1dHRvbi10b2dnbGUtZ3JvdXAiKS5lcSgwKTt0aGlzLl8kdG9nZ2xlR3JvdXBOYW1lPShhPXRoaXMuXyR0b2dnbGVHcm91cEVsZW1lbnQuZGF0YSgiYS1idXR0b24tZ3JvdXAiKSk/YS5uYW1lOnZvaWQgMH0sbmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8kdG9nZ2xlR3JvdXBOYW1lfSxnZXRUb2dnbGVCdXR0b25CeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0VG9nZ2xlQnV0dG9uQnlTZWxlY3RvcigiLmEtYnV0dG9uOmhhcyhbbmFtZVx4M2QiK2ErIl0pIil9LHNldFNlbGVjdGVkOmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRUb2dnbGVCdXR0b25CeVNlbGVjdG9yKGEpO2EuaXNFbmFibGVkKCkmJih0aGlzLmdldFNlbGVjdGVkKCkuc2V0VW5zZWxlY3RlZCgpLGEuc2V0U2VsZWN0ZWQoKSk7cmV0dXJuIHRoaXN9LGdldFNlbGVjdGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VG9nZ2xlQnV0dG9uQnlTZWxlY3RvcigiLmEtYnV0dG9uLmEtYnV0dG9uLXNlbGVjdGVkIil9LApnZXRUb2dnbGVCdXR0b25CeVNlbGVjdG9yOmZ1bmN0aW9uKGEpe3JldHVybiBlKHRoaXMuXyR0b2dnbGVHcm91cEVsZW1lbnQuZmluZChhKSl9fSk7cmV0dXJuIGZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBmKGEsYil9fSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGMpe3ZhciBlPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZj1lLl9uYW1lc3BhY2V8fGUuYXR0cmlidXRlRXJyb3JzLGE9Zj9mKCJBbWF6b25VSU1ldGVyIiwiQW1hem9uVUkiKTplO2EuZ3VhcmRGYXRhbD9hLmd1YXJkRmF0YWwoYykoYSx3aW5kb3cpOmEuZXhlY3V0ZShmdW5jdGlvbigpe2MoYSx3aW5kb3cpfSl9KShmdW5jdGlvbihjLGUsZil7Yy53aGVuKCJBIiwicmVhZHkiKS5yZWdpc3RlcigiYS1tZXRlcnMiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuJDtpZihkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXt2YXIgYz1mdW5jdGlvbihhKXthLnJlbW92ZUNsYXNzKCJhLW1ldGVyLXVuZmlsbGVkIikuYWRkQ2xhc3MoImEtbWV0ZXItZmlsbGVkIil9O2IoIi5hLW1ldGVyLWJhciIpLm5vdCgiLmEtbWFudWFsLWFuaW1hdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1iKHRoaXMpO2Eub25TY3JlZW4oZCwwKXx8ZC5hZGRDbGFzcygiYS1tZXRlci11bmZpbGxlZCIpfSk7CmIoImJvZHkiKS5hZGRDbGFzcygiYS1tZXRlci1hbmltYXRlIik7YS5vbigicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIHNjcm9sbCIsZnVuY3Rpb24oZCl7YigiLmEtbWV0ZXItdW5maWxsZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Yih0aGlzKTthLm9uU2NyZWVuKGQsMCkmJmMoZCl9KX0pO2Eub24oImE6cG9wb3ZlcjphZnRlclNob3ciLGZ1bmN0aW9uKGEpeyJhamF4IiE9PWEucG9wb3Zlci5jdXJyZW50RGF0YVN0cmF0ZWd5JiYoYT1hLnBvcG92ZXIuJHBvcG92ZXIuZmluZCgiLmEtbWV0ZXItdW5maWxsZWQiKSxhLmxlbmd0aCYmYyhhKSl9KTthLm9uKCJhOnBvcG92ZXI6YWpheENvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKGQpe3ZhciBiPWQucG9wb3Zlci4kcG9wb3Zlci5maW5kKCIuYS1tZXRlci1iYXIiKS5ub3QoIi5hLW1hbnVhbC1hbmltYXRpb24iKTtiLmxlbmd0aCYmKGIuYWRkQ2xhc3MoImEtbWV0ZXItdW5maWxsZWQiKSxhLmRlbGF5KGZ1bmN0aW9uKCl7YyhiKX0sMTcpKX0pfX0pfSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihnKXt2YXIgeT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLHo9eS5fbmFtZXNwYWNlfHx5LmF0dHJpYnV0ZUVycm9ycyxiPXo/eigiQW1hem9uVUlTdGFuZGFyZENvbXBvbmVudCIsIkFtYXpvblVJIik6eTtiLmd1YXJkRmF0YWw/Yi5ndWFyZEZhdGFsKGcpKGIsd2luZG93KTpiLmV4ZWN1dGUoZnVuY3Rpb24oKXtnKGIsd2luZG93KX0pfSkoZnVuY3Rpb24oZyx5LHope2cud2hlbigiQSIsInBydjphLXNjLWNvbXBvbmVudC1mYWN0b3J5IikucmVnaXN0ZXIoImEtc2MiLGZ1bmN0aW9uKGIsZil7dmFyIGQ9bmV3IGY7cmV0dXJue2RlZmluZTpmdW5jdGlvbihhKXthLmNvbXBvbmVudHMmJmIuZWFjaChhLmNvbXBvbmVudHMsZnVuY3Rpb24oYSl7aWYoIShhIGluc3RhbmNlb2YgZikpdGhyb3cgRXJyb3IoIllvdSBtdXN0IHByb3ZpZGUgYSBjb21wb25lbnQgZmFjdG9yeSB3aGVuIHNwZWNpZnlpbmcgY2hpbGQgY29tcG9uZW50cyIpO30pO3JldHVybiBkLnJlZGVmaW5lKGEpfX19KTsKZy53aGVuKCJBIikucmVnaXN0ZXIoInBydjphLXNjLXV0aWwiLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGYoYSxiLGMpeyJ2YWx1ZSJpbiBjJiYoYVtiXT1jLnZhbHVlKTtyZXR1cm4gYX1iPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgZDt0cnl7Yih7fSwieCIse30pLGQ9ITB9Y2F0Y2goYSl7ZD0hMX1yZXR1cm57ZGVmaW5lUHJvcGVydHk6ZD9iOmZ9fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLXV0aWwiKS5yZWdpc3RlcigicHJ2OmEtc2MtYmFzZSIsZnVuY3Rpb24oYixmKXt2YXIgZD1mLmRlZmluZVByb3BlcnR5O2I9Yi5jcmVhdGVDbGFzcyh7aW5pdDpmdW5jdGlvbihhLGIsYyl7ZCh0aGlzLCJfX3NpZCIse3ZhbHVlOmF9KTtkKHRoaXMsIl9faWQiLHt2YWx1ZTpifSk7ZCh0aGlzLCJfX3BpZCIse3ZhbHVlOmN9KTtkKHRoaXMsImlzUm9vdCIse3ZhbHVlOiFjLHdyaXRhYmxlOiExfSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiIrdGhpcy5fX2lkfX0pOwpmPWIuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLl9zdXBlcihhLGIsYyk7ZCh0aGlzLCJfX2F0Iix7dmFsdWU6LTEsd3JpdGFibGU6ITB9KTtkKHRoaXMsIl9fdG8iLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSk7ZCh0aGlzLCJfX2J1c3kiLHt2YWx1ZTohMSx3cml0YWJsZTohMH0pfX0pO3JldHVybntDb21wb25lbnRTdGF0ZTpiLENvbXBvbmVudDpmfX0pOyJ1c2Ugc3RyaWN0IjtnLndoZW4oInBydjphLXNjLWRhdGFzdG9yZSIpLnJlZ2lzdGVyKCJwcnY6YS1zYy1yZWdpc3RyeSIsZnVuY3Rpb24oYil7dmFyIGY9e30sZD17fSxhPTAsZT0wO3JldHVybntzcGVjaWZpY2F0aW9uczp7fSxjb25zdHJ1Y3RvcnM6e30saW5zdGFuY2VzOmYsZGF0YXN0b3Jlczp7fSxoaWVyYXJjaHk6ZCxlbGVtZW50czp7fSxoYW5kbGVyczp7fSxjaGlsZHJlbjpmdW5jdGlvbihhKXthPWRbYV07dmFyIGI9W10sZTtmb3IoZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIucHVzaChmW2FbZV1dKTsKcmV0dXJuIGJ9LGdldE5leHRJbnN0YW5jZUlkOmZ1bmN0aW9uKCl7cmV0dXJuKythfSxnZXROZXh0U3BlY2lmaWNhdGlvbklkOmZ1bmN0aW9uKCl7cmV0dXJuKytlfX19KTsidXNlIHN0cmljdCI7Zy53aGVuKCJBIiwicHJ2OmEtc2MtdXRpbCIpLnJlZ2lzdGVyKCJwcnY6YS1zYy1saWZlY3ljbGUiLGZ1bmN0aW9uKGIsZil7ZnVuY3Rpb24gZCgpe3JldHVybiBiLmNvbnN0YW50cy5OT09QfWZ1bmN0aW9uIGEoYSxiLGUpe2ModGhpcywibmFtZSIse3ZhbHVlOmF9KTtjKHRoaXMsImVudGVyIix7dmFsdWU6Yn0pO2ModGhpcywibGVhdmUiLHt2YWx1ZTplfSl9ZnVuY3Rpb24gZShhKXtjKHRoaXMsInN0YXRlcyIse3ZhbHVlOmF9KTtjKHRoaXMsInN0YXRlTmFtZXMiLHt2YWx1ZTpiLm1hcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9KX0pO2ModGhpcywibWV0aG9kTmFtZXMiLHt2YWx1ZTpiLnJlZHVjZShhLGZ1bmN0aW9uKGEsYil7YS5wdXNoKGIuZW50ZXIpO2EucHVzaChiLmxlYXZlKTsKcmV0dXJuIGF9LFtdKX0pfXZhciBjPWYuZGVmaW5lUHJvcGVydHk7YS5jcmVhdGU9ZnVuY3Rpb24oYixlLGMpe3JldHVybiBuZXcgYShiLGUsYyl9O2UucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RhdGVOYW1lcy5pbmRleE9mKGEpfTtlLnByb3RvdHlwZS5lbnRlckZvckluZGV4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0YXRlc1thXS5lbnRlcn07ZS5wcm90b3R5cGUubGVhdmVGb3JJbmRleD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdGF0ZXNbYV0ubGVhdmV9O2UucHJvdG90eXBlLmdldFRyYW5zaXRpb25BcnJheT1mdW5jdGlvbihhLGUpe3ZhciBjPWE8ZSxoPWM/ImVudGVyIjoibGVhdmUiLGY9Yz8xOi0xO3JldHVybiBiLm1hcChiLnJhbmdlKGM/YSsxOmEsZStmLGYpLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0YXRlc1thXVtoXX0sdGhpcyl9O2UucHJvdG90eXBlLmltcGxlbWVudD1mdW5jdGlvbihhLGUpe2E9YXx8e307ZT0iZnVuY3Rpb24iPT09CnR5cGVvZiBlP2U6ZDtyZXR1cm4gYi5yZWR1Y2UodGhpcy5zdGF0ZXMsZnVuY3Rpb24oYixjKXtiW2MuZW50ZXJdPWFbYy5lbnRlcl18fGUoYy5lbnRlcixjKTtiW2MubGVhdmVdPWFbYy5sZWF2ZV18fGUoYy5sZWF2ZSxjKTtyZXR1cm4gYn0se30pfTtlLmNyZWF0ZT1mdW5jdGlvbihjKXtjPWIubWFwKGMsZnVuY3Rpb24oYil7cmV0dXJuIGEuY3JlYXRlLmFwcGx5KG51bGwsYil9KTtyZXR1cm4gbmV3IGUoYyl9O3JldHVybntjcmVhdGU6ZS5jcmVhdGV9fSk7InVzZSBzdHJpY3QiO2cud2hlbigicHJ2OmEtc2MtbGlmZWN5Y2xlIikucmVnaXN0ZXIoInBydjphLXNjLWxpZmVjeWNsZS1pbnN0YW5jZXMiLGZ1bmN0aW9uKGIpe3JldHVybntzdGFuZGFyZDpiLmNyZWF0ZShbWyJjcmVhdGVkIiwiY3JlYXRlIiwiZGVzdHJveSJdLFsibG9hZGVkIiwibG9hZCIsInVubG9hZCJdLFsicmVuZGVyZWQiLCJyZW5kZXIiLCJyZW1vdmUiXSxbInZpc2libGUiLCJzaG93IiwiaGlkZSJdXSl9fSk7InVzZSBzdHJpY3QiOwpnLndoZW4oIkEiKS5yZWdpc3RlcigicHJ2OmEtc2MtZXZlbnQtZW1pdHRlciIsZnVuY3Rpb24oYil7dmFyIGY9L1xzKy8sZD17b246ZnVuY3Rpb24oYSxlLGMpe2E9Zi50ZXN0KGEpP2Euc3BsaXQoZik6YTtiLmlzQXJyYXkoYSk/Yi5lYWNoKGEsZnVuY3Rpb24oYSl7dGhpcy5vbihhLGUsYyl9LHRoaXMpOih0aGlzLl9fZXZlbnRzW2FdfHwodGhpcy5fX2V2ZW50c1thXT1bXSkpLnB1c2goe2hhbmRsZXI6ZSxjb250ZXh0OmN8fHRoaXN9KTtyZXR1cm4gdGhpc30sb2ZmOmZ1bmN0aW9uKGEsZSl7dmFyIGMsZDtpZighYSYmIWUpcmV0dXJuIHRoaXMuX19ldmVudHM9e30sdGhpczthPWYudGVzdChhKT9hLnNwbGl0KGYpOmE7aWYoYi5pc0FycmF5KGEpKXJldHVybiBiLmVhY2goYSxmdW5jdGlvbihhKXt0aGlzLm9mZihhLGUpfSx0aGlzKSx0aGlzO2lmKCFlKXJldHVybiBkZWxldGUgdGhpcy5fX2V2ZW50c1thXSx0aGlzO2M9dGhpcy5fX2V2ZW50c1thXTt0aGlzLl9fZXZlbnRzW2FdPWQ9CltdO2IuZWFjaChjLGZ1bmN0aW9uKGEpe2EuaGFuZGxlciE9PWUmJmQucHVzaChhKX0sdGhpcyk7ZC5sZW5ndGh8fGRlbGV0ZSB0aGlzLl9fZXZlbnRzW2FdO3JldHVybiB0aGlzfSx0cmlnZ2VyOmZ1bmN0aW9uKGEpe3ZhciBlLGM7aWYoIXRoaXMuX19ldmVudHN8fCFhKXJldHVybiB0aGlzO2M9dGhpcy5fX2V2ZW50c1thXTtpZighYylyZXR1cm4gdGhpcztlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2IuZWFjaChjLGZ1bmN0aW9uKGEpe2EuaGFuZGxlci5hcHBseShhLmNvbnRleHQsZSl9KTtyZXR1cm4gdGhpc319O3JldHVybntpbml0OmZ1bmN0aW9uKGEpe2EuX19ldmVudHM9YS5fX2V2ZW50c3x8e307cmV0dXJuIGF9LG1peGluOmZ1bmN0aW9uKGEpe2IubWl4aW4oYSxkKTtyZXR1cm4gYX19fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLWJhc2UiLCJwcnY6YS1zYy1saWZlY3ljbGUtaW5zdGFuY2VzIiwiM3AtcHJvbWlzZSIsInBydjphLXNjLWRlZmF1bHQtZGF0YXN0b3JlIiwKInBydjphLXNjLXJlZ2lzdHJ5IiwicHJ2OmEtc2MtY29tcG9uZW50LXByb3hpZXMiKS5yZWdpc3RlcigicHJ2OmEtc2MtZGVmaW5lIixmdW5jdGlvbihiLGYsZCxhLGUsYyxwKXtmdW5jdGlvbiBnKG0sYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxjPWhbdGhpcy5fX3NpZF0sZj1hLnJlc29sdmUoKSxkPXRoaXMuX19hdCxyO2lmKGQ9PT1tfHxiJiZkPm18fCFiJiZkPG0pcmV0dXJuIGY7Zm9yKGQ9ay5nZXRUcmFuc2l0aW9uQXJyYXkoZCxtKTtyPWQuc2hpZnQoKTspKGZ1bmN0aW9uKGEpe2Y9Zi50aGVuKGMubGlmZWN5Y2xlW2FdLmNhbGwobmV3IHAuVHJhbnNpdGlvbihlKSkpLnRoZW4oYy52aWV3W2FdLmNhbGwobmV3IHAuVmlldyhlKSkpLnRoZW4oZnVuY3Rpb24oKXtiP2UuX19hdCsrOmUuX19hdC0tfSl9KShyKTtyZXR1cm4gZlsiY2F0Y2giXShmdW5jdGlvbihhKXtjb25zb2xlLmVycm9yKGEpfSl9fXZhciBrPWQuc3RhbmRhcmQsaD1jLnNwZWNpZmljYXRpb25zLHI9CmMuY29uc3RydWN0b3JzLGw9Yy5pbnN0YW5jZXMsbj1jLmRhdGFzdG9yZXMsdD1jLmhpZXJhcmNoeSx1PWMuaGFuZGxlcnMsdix4O2Q9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtmb3IodmFyIHc9MDt3PGsuc3RhdGVzLmxlbmd0aDt3Kyspdj1rLnN0YXRlc1t3XSxkW3YuZW50ZXJdPWcodywhMCksZFt2LmxlYXZlXT1nKHcsITEpO3g9Zi5Db21wb25lbnQuZXh0ZW5kKGQpO3JldHVybiBmdW5jdGlvbihhLGQpe2EubGlmZWN5Y2xlPWsuaW1wbGVtZW50KGEubGlmZWN5Y2xlfHx7fSk7YS52aWV3PWsuaW1wbGVtZW50KGEudmlld3x8e30pO3ZhciBmPWEuY29tcG9uZW50c3x8e30sdj1hLmRhdGF8fHt9LHA9YS5ldmVudHN8fHt9LGc7ZD1kfHxjLmdldE5leHRTcGVjaWZpY2F0aW9uSWQoKTtoW2RdPWE7dVtkXT17fTtmb3IoZyBpbiBwKXAuaGFzT3duUHJvcGVydHkoZykmJih1W2RdW2ddPXBbZ10pO3JldHVybiB4LmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhLAptKXt2YXIgaD1jLmdldE5leHRJbnN0YW5jZUlkKCk7dGhpcy5fc3VwZXIoZCxoLG0pO2E9Yi5leHRlbmQoe30sdixhKTtsW2hdPXRoaXM7bltoXT1uZXcgZShhKTt0W2hdPXt9O2IuZWFjaChmLGZ1bmN0aW9uKGEsYil7YT1uZXcgclthXShhLmRlZmF1bHREYXRhLGgpO3RbaF1bYl09YS50b1N0cmluZygpfSl9fSl9fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLWV2ZW50LWVtaXR0ZXIiLCJwcnY6YS1zYy11dGlsIikucmVnaXN0ZXIoInBydjphLXNjLWRhdGFzdG9yZSIsZnVuY3Rpb24oYixmLGQpe3ZhciBhPWQuZGVmaW5lUHJvcGVydHk7cmV0dXJuIGIuY3JlYXRlQ2xhc3Moe2luaXQ6ZnVuY3Rpb24oZSl7aWYoZSYmIm9iamVjdCIhPT10eXBlb2YgZSl0aHJvdyBFcnJvcigiRGF0YXN0b3JlcyBvbmx5IGFjY2VwdCBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMgYXMgaW5wdXQiKTtlPWIuY29weShlfHx7fSk7YSh0aGlzLCJzdG9yZSIse3ZhbHVlOmV9KX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0b3JlW2FdfSwKc2V0OmZ1bmN0aW9uKGEsYil7aWYodm9pZCAwPT09YXx8bnVsbD09PWF8fHZvaWQgMD09PWIpcmV0dXJuITE7dGhpcy5zdG9yZVthXT1iO3JldHVybiEwfX0pLmV4dGVuZChmLm1peGluKHtpbml0OmZ1bmN0aW9uKGEpe3RoaXMuX3N1cGVyKGEpO2YuaW5pdCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5zdG9yZVthXTtyZXR1cm4gdGhpcy5fc3VwZXIoYSxjKSYmIWIuZXF1YWxzKGQsYyk/KHRoaXMudHJpZ2dlcigiY2hhbmdlOiIrYSxkLGMpLCEwKTohMX19KSl9KTsidXNlIHN0cmljdCI7Zy53aGVuKCJBIiwicHJ2OmEtc2MtZGF0YXN0b3JlIiwicHJ2OmEtc2MtcmVnaXN0cnkiLCJwcnY6YS1zYy1jb21wb25lbnQtcHJveGllcyIsInBydjphLXNjLWxpZmVjeWNsZS1pbnN0YW5jZXMiKS5yZWdpc3RlcigicHJ2OmEtc2MtZGVmYXVsdC1kYXRhc3RvcmUiLGZ1bmN0aW9uKGIsZixkLGEsZSl7dmFyIGM9L1xzKy8sZz1kLmluc3RhbmNlcyxxPWQuc3BlY2lmaWNhdGlvbnMsCms9ZS5zdGFuZGFyZCxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihjLGQpe2M9Z1tjXTt2YXIgZT1xW2MuX19zaWRdLnZpZXcsZj1rLmVudGVyRm9ySW5kZXgoYy5fX2F0KTtlW2ZdLmNhbGwobmV3IGEuVmlldyhjKSxkKX12YXIgYz17fSxkPXt9O3JldHVybnthZGQ6ZnVuY3Rpb24oYSxlLGYsaCl7dmFyIGs9ZFthXSxtPWNbYV07YT1nW2FdO2smJmNsZWFyVGltZW91dChrKTttfHwoY1thXT1tPXt9KTttW2VdPXtvbGRWYWx1ZTpmLG5ld1ZhbHVlOmh9O2RbYV09c2V0VGltZW91dChmdW5jdGlvbigpe2IoYSxtKTtkW2FdPWNbYV09bnVsbH0sMTAwKX0sdHJpZ2dlcjpifX0oKTtyZXR1cm4gZi5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYztmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJiJmdW5jdGlvbiIhPT10eXBlb2YgYVtjXSYmKGJbY109YVtjXSk7dGhpcy5fc3VwZXIoYil9LGdldFByb3h5OmZ1bmN0aW9uKGEsZCl7dmFyIGU9dGhpcyxmPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGUuZ2V0KGEpfX07CiEwIT09ZCYmKGYuc2V0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuc2V0KGEsYil9LGYuYmluZD1mdW5jdGlvbihkLGYpe2Q9ZC5zcGxpdChjKTtmPWZ8fHt9O2IuZWFjaChkLGZ1bmN0aW9uKGIpe2Uub24oImNoYW5nZToiK2IsZnVuY3Rpb24oYyxkKXt2YXIgZTshMT09PWYuYmF0Y2g/KGU9e30sZVtiXT17b2xkVmFsdWU6YyxuZXdWYWx1ZTpkfSxoLnRyaWdnZXIoYSxlKSk6aC5hZGQoYSxiLGMsZCl9KX0pfSxmLnVuYmluZD1mdW5jdGlvbihhKXthPyhhPWEuc3BsaXQoYyksYi5lYWNoKGEsZnVuY3Rpb24oYSl7ZS5vZmYoImNoYW5nZToiK2EpfSkpOmUub2ZmKCl9KTtyZXR1cm4gZn19KX0pOyJ1c2Ugc3RyaWN0IjtnLndoZW4oIkEiLCJwcnY6YS1zYy1kZWZpbmUiKS5yZWdpc3RlcigicHJ2OmEtc2MtY29tcG9uZW50LWNvbGxlY3Rpb24iLGZ1bmN0aW9uKGIsZil7dmFyIGQ9e307cmV0dXJue2dldDpmdW5jdGlvbihhKXtpZihkW2FdKXJldHVybiBkW2FdO2RbYV09Zih7ZGF0YTp7ZmFjdG9yeTphLAppbmRleDpbXX19KTtyZXR1cm4gZFthXX19fSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLXJlZ2lzdHJ5IiwicHJ2OmEtc2MtYmFzZSIsInBydjphLXNjLWRlZmluZSIsInBydjphLXNjLWNvbXBvbmVudC1jb2xsZWN0aW9uIikucmVnaXN0ZXIoInBydjphLXNjLWNvbXBvbmVudC1mYWN0b3J5IixmdW5jdGlvbihiLGYsZCxhLGUpe3ZhciBjPWYuc3BlY2lmaWNhdGlvbnMsZz1mLmNvbnN0cnVjdG9ycyxxPTAsaz1kLkNvbXBvbmVudFN0YXRlLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLl9zdXBlcihhLGJ8fCsrcSk7dGhpcy5kZWZhdWx0RGF0YT1kfHx7fTtjJiYoZ1t0aGlzXT1jKX0sZ2V0SW5zdGFuY2U6ZnVuY3Rpb24oYSl7dmFyIGM9Z1t0aGlzXTthPWIuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdERhdGEsYSk7cmV0dXJuIG5ldyBjKGEpfSx0b0NvbGxlY3Rpb246ZnVuY3Rpb24oKXtpZighZ1t0aGlzXSl0aHJvdyBFcnJvcigiWW91IGNhbm5vdCBjcmVhdGUgYSBjb2xsZWN0aW9uIG9mIG5vdGhpbmciKTsKcmV0dXJuIG5ldyBrKG51bGwsbnVsbCxlLmdldCh0aGlzKSx0aGlzLmRlZmF1bHREYXRhKX0scmVkZWZpbmU6ZnVuY3Rpb24oZCl7dmFyIGU9Yi5rZXlzKGQpO2lmKCFlLmxlbmd0aCYmdGhpcy5fX3NpZCl0aHJvdyBFcnJvcigiWW91IG11c3QgcHJvdmlkZSBhIG5ldyBzcGVjaWZpY2F0aW9uIHRvIHRoZSBgcmVkZWZpbmVgIG1ldGhvZCIpO2lmKDE9PT1lLmxlbmd0aCYmImRhdGEiPT09ZVswXSlyZXR1cm4gbmV3IGsodGhpcy5fX3NpZCx0aGlzLl9faWQsbnVsbCxkLmRhdGEpO2Q9Yi5leHRlbmQoe30sY1t0aGlzLl9fc2lkXXx8e30sZCk7ZT1mLmdldE5leHRTcGVjaWZpY2F0aW9uSWQoKTtkPWEoZCxlKTtyZXR1cm4gbmV3IGsoZSxudWxsLGQpfX0pO3JldHVybiBrfSk7InVzZSBzdHJpY3QiO2cud2hlbigiQSIsInBydjphLXNjLXJlZ2lzdHJ5IiwicHJ2OmEtc2MtYmFzZSIsInBydjphLXNjLWV2ZW50cyIsInBydjphLXNjLWxpZmVjeWNsZS1pbnN0YW5jZXMiLCIzcC1wcm9taXNlIikucmVnaXN0ZXIoInBydjphLXNjLWNvbXBvbmVudC1wcm94aWVzIiwKZnVuY3Rpb24oYixmLGQsYSxlLGMpe3ZhciBnPWYuaW5zdGFuY2VzLHE9Zi5jb25zdHJ1Y3RvcnMsaz1mLmRhdGFzdG9yZXMsaD1mLmhpZXJhcmNoeSxyPWYuZWxlbWVudHMsbD1lLnN0YW5kYXJkLG49L1xzKy8sdD1NYXRoLnBvdygyLDMyKTtmPWQuQ29tcG9uZW50U3RhdGUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYixjKXthIGluc3RhbmNlb2YgZC5Db21wb25lbnRTdGF0ZT90aGlzLl9zdXBlcihhLl9fc2lkLGEuX19pZCxhLl9fcGlkKTp0aGlzLl9zdXBlcihhLGIsYyl9fSk7dmFyIHU9Zi5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX3N1cGVyKGEsYixjKTt0aGlzLmRhdGE9a1t0aGlzXS5nZXRQcm94eSh0aGlzKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyB4KHRoaXMpKS5maWx0ZXIoYSl9LGNvbGxlY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB3KHRoaXMsYSl9LGRpc3BhdGNoOmZ1bmN0aW9uKGIpe2EuZGlzcGF0Y2guY2FsbCh0aGlzLApiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX0sYnJvYWRjYXN0OmZ1bmN0aW9uKGIpe2EuYnJvYWRjYXN0LmNhbGwodGhpcyxiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KTtlPWYuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLl9zdXBlcihhLGIsYyk7dGhpcy5kYXRhPWtbdGhpc10uZ2V0UHJveHkodGhpcywhMCl9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gclt0aGlzLl9faWRdfHxudWxsfSxzZXRFbGVtZW50OmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudClyW3RoaXMuX19pZF09YTtlbHNlIHRocm93IEVycm9yKCJZb3UgbXVzdCBwcm92aWRlIGFuIEhUTUxFbGVtZW50IG9iamVjdCB0byBWaWV3LnNldEVsZW1lbnQiKTt9LHVuc2V0RWxlbWVudDpmdW5jdGlvbigpe3JbdGhpcy5fX2lkXT1udWxsfSxkaXNwYXRjaDpmdW5jdGlvbihiKXthLnZpZXdEaXNwYXRjaC5jYWxsKG5ldyB1KHRoaXMuX19zaWQsdGhpcy5fX2lkLAp0aGlzLl9fcGlkKSxiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KTt2YXIgdj17aW5pdDpmdW5jdGlvbihhKXt0aGlzLl9zdXBlcihhKTt0aGlzLl9fY2FjaGU9W119LGZpbHRlcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9fY2FjaGU9W107YSYmInN0cmluZyI9PT10eXBlb2YgYT8oYz1iLm1hcChhLnNwbGl0KG4pLGZ1bmN0aW9uKGEpe3JldHVybihhPWhbdGhpc11bYV18fG51bGwpP2dbYV06YX0sdGhpcyksYz1iLmZpbHRlcihjLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YX0pKTpjPWIubWFwKGIudmFsdWVzKGhbdGhpc10pLGZ1bmN0aW9uKGEpe3JldHVybiBnW2FdfSk7dGhpcy5fX2NhY2hlPWM7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGIsYyl7Yj1uZXcgcVtiXShjLHRoaXMuX19pZCk7aFt0aGlzXVthXT1iLl9faWQ7dGhpcy5fX2NhY2hlLnB1c2goYik7cmV0dXJuIHRoaXN9LGRpc293bjpmdW5jdGlvbihhKXt2YXIgYz1oW3RoaXNdW2FdLGQ7aWYoIWMpcmV0dXJuIHRoaXM7CmRlbGV0ZSBoW3RoaXNdW2FdO2Q9Z1tjXTt0aGlzLl9fY2FjaGU9Yi5maWx0ZXIodGhpcy5fX2NhY2hlLGZ1bmN0aW9uKGEpe3JldHVybiBhIT09ZH0pO3JldHVybiB0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2NhY2hlLmxlbmd0aH19LGw9bC5pbXBsZW1lbnQoe30sZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMuYWxsKGIubWFwKHRoaXMuX19jYWNoZSxmdW5jdGlvbihiKXtyZXR1cm4gYlthXSgpfSkpfX0pO2IubWl4aW4odixsKTt2YXIgeD1mLmV4dGVuZCh2KSx3PXguZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYil7YT1nW2hbYV1bYl1dO2lmKCFhKXRocm93IEVycm9yKCJDaGlsZCBjb2xsZWN0aW9uIG5hbWVkICIrYisiIGRvZXMgbm90IGV4aXN0Iik7dGhpcy5fc3VwZXIoYSk7dGhpcy5maWx0ZXIoKX0sZmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N1cGVyKCl9LGFkZDpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZjtpZigic3RyaW5nIj09PQp0eXBlb2YgYXx8IWIuaXNGaW5pdGVOdW1iZXIoYykpdGhyb3cgRXJyb3IoIkFyZ3VtZW50IGVycm9yLCB1c2FnZTogQ29sbGVjdGlvbi5hZGQoZGF0YTpvYmplY3QsIGluZGV4OmludGVnZXIpIik7ZD1rW3RoaXNdO2U9ZC5nZXQoImZhY3RvcnkiKTtmPWQuZ2V0KCJpbmRleCIpO2U9bmV3IHFbZV0oYSx0aGlzLl9faWQpO2E9ZS50b1N0cmluZygpO2hbdGhpc11bYV09ZS5fX2lkO3RoaXMuX19jYWNoZS5wdXNoKGUpO2Yuc3BsaWNlKGMsMCxhKTtkLnNldCgiaW5kZXgiLGYpO3JldHVybiB0aGlzfSxhcHBlbmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKGEsdCl9LHByZXBlbmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKGEsMCl9LGluc2VydDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmFkZChhLGIpfSxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9a1t0aGlzXS5nZXQoImluZGV4Iik7aWYoMD5hfHxhPmIubGVuZ3RoLTEpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7CnJldHVybihuZXcgeCh0aGlzKSkuZmlsdGVyKGJbYV0pfSxkaXNvd246ZnVuY3Rpb24oYSl7dmFyIGI9a1t0aGlzXS5nZXQoImluZGV4Iik7aWYoMD5hfHxhPmIubGVuZ3RoLTEpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7YT1iLnNwbGljZShhLDEpO3JldHVybiB0aGlzLl9zdXBlcihhWzBdKX19KTtyZXR1cm57VHJhbnNpdGlvbjp1LFZpZXc6ZSxDaGlsZENvbXBvbmVudDp4LENoaWxkQ29sbGVjdGlvbjp3fX0pOyJ1c2Ugc3RyaWN0IjtnLndoZW4oIkEiLCJwcnY6YS1zYy1yZWdpc3RyeSIpLnJlZ2lzdGVyKCJwcnY6YS1zYy1ldmVudHMiLGZ1bmN0aW9uKGIsZil7dmFyIGQ9Zi5pbnN0YW5jZXMsYT1mLmhhbmRsZXJzLGU9ZnVuY3Rpb24gcChiLGUpe3ZhciBmPXRoaXMuY29uc3RydWN0b3IsZyxsLG47dGhpcy5pc1Jvb3R8fChsPWRbdGhpcy5fX3BpZF0sZz1hW2wuX19zaWRdW2JdLGY9bmV3IGYobC5fX3NpZCxsLl9faWQsbC5fX3BpZCksZyYmKG49CiExPT09Zy5hcHBseShmLGUpKSxufHxwLmNhbGwoZixiLGUpKX07cmV0dXJue2Rpc3BhdGNoOmUsdmlld0Rpc3BhdGNoOmZ1bmN0aW9uKGIsZil7dmFyIGcsaDsoZz1hW2RbdGhpc10uX19zaWRdW2JdKSYmKGg9ITE9PT1nLmFwcGx5KHRoaXMsZikpO2h8fGUuY2FsbCh0aGlzLGIsZil9LGJyb2FkY2FzdDpmdW5jdGlvbiBxKGQsZSl7dmFyIGc9dGhpcy5jb25zdHJ1Y3RvcixsPWYuY2hpbGRyZW4odGhpcyksbix0LHU7bC5sZW5ndGgmJmIuZWFjaChsLGZ1bmN0aW9uKGIpe3Q9YVtiLl9fc2lkXVtkXTtuPW5ldyBnKGIuX19zaWQsYi5fX2lkLGIuX19waWQpO3QmJih1PSExPT09dC5hcHBseShuLGUpKTt1fHxxLmNhbGwobixkLGUpfSl9fX0pfSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihmKXt2YXIgcT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLGs9cS5fbmFtZXNwYWNlfHxxLmF0dHJpYnV0ZUVycm9ycyxkPWs/aygiQW1hem9uVUlDYXJkIiwiQW1hem9uVUkiKTpxO2QuZ3VhcmRGYXRhbD9kLmd1YXJkRmF0YWwoZikoZCx3aW5kb3cpOmQuZXhlY3V0ZShmdW5jdGlvbigpe2YoZCx3aW5kb3cpfSl9KShmdW5jdGlvbihmLHEsayl7Zi5yZWdpc3RlcigicHJ2OmEtY2FyZC1jb25zdGFudHMiLGZ1bmN0aW9uKCl7dmFyIGQ9e1BJTk5FRF9BU19GSVhFRDowLFBJTk5FRF9BU19SRUxBVElWRToxLENBUkRfRE9XTjotMSxDQVJEX1VQOjEsQ0FSRF9QRUVLX1NJWkU6NzUsQ0FSRF9QSU5ORURfSEVBREVSX1NJWkU6NTYsQ0FSRF9QRUVLX0RFU0NSSVBUSU9OX1NVRkZJWDoiLWNhcmQtcGVlay1sYWJlbCIsQ0FSRF9CT0RZX0lEX1NVRkZJWDoiLWNhcmQtYm9keSIsc2VsZWN0b3JzOntDQVJEX0xJU1Q6Ii5hLWNhcmQtbGlzdCIsQ0FSRDoiLmEtY2FyZCIsCkNBUkRfSEVBREVSOiIuYS1jYXJkLWhlYWRlciIsQ0FSRF9CT0RZOiIuYS1jYXJkLWJvZHkiLENBUkRfQTExWV9MQUJFTDoiLmEtY2FyZC1wZWVrLWxhYmVsIn19O2Yud2hlbigicHJ2OnNraW4tdmFycyIpLmV4ZWN1dGUoZnVuY3Rpb24oZil7ZC5DQVJEX1BJTk5FRF9IRUFERVJfU0laRT1mLmNhcmQuQ0FSRF9QSU5ORURfSEVBREVSX1NJWkV9KTtyZXR1cm4gZH0pOyJ1c2Ugc3RyaWN0IjtmLndoZW4oIkEiLCJhLXNjIiwicHJ2OmEtY2FyZC1jb25zdGFudHMiKS5yZWdpc3RlcigiYS1jYXJkLWNvbXBvbmVudCIsZnVuY3Rpb24oZCxmLGcpe2Z1bmN0aW9uIGgoYixlLGEpe2Zvcig7IWUoYik7KXtmb3IodmFyIGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpJiZhW2NdKGIpKXJldHVybiBjO2I9Yi5wYXJlbnROb2RlfXJldHVybiIyIn1mdW5jdGlvbiBxKGIsZSxhKXtlJiYoZT1lLmdldEF0dHJpYnV0ZSgiaWQiKSxiLnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYT8iIjoKZSkpfWZ1bmN0aW9uIHQoYil7cmV0dXJuIGIuaXNUb3BUb3VjaGluZ0NhbnZhc1RvcHx8Yi5pc0N1dEJ5Q2FudmFzVG9wfWZ1bmN0aW9uIGsoYil7cmV0dXJuIGIuaXNUb3BUb3VjaGluZ0NhbnZhc1RvcHx8Yi5pc1RvcEJlbG93Q2FudmFzVG9wfWZ1bmN0aW9uIHYoYil7cmV0dXJuIGIuaXNCb3R0b21Ub3VjaENhbnZhc1RvcHx8Yi5pc0N1dEJ5Q2FudmFzVG9wfWZ1bmN0aW9uIGEoYil7cmV0dXJuIGIuaXNCb3R0b21Ub3VjaENhbnZhc1RvcHx8Yi5pc0Fib3ZlQ2FudmFzfWZ1bmN0aW9uIGMoYixlLGEpe2E/Yi5jbGFzc0xpc3QuYWRkKGUpOmIuY2xhc3NMaXN0LnJlbW92ZShlKX1yZXR1cm4gZi5kZWZpbmUoe2RhdGE6e2lkOiIiLGlkeDoiIixzZWxlY3RvcjoiIixleHBhbmRhYmxlOiExLGV4cGFuZGVkOiExLHBpbm5lZDohMSxoYXNQZWVrOiExLGNhbnZhc1RvcDowLHBpbm5lZE1vZGU6LTEsdW5waW5uZWRIZWFkZXJIZWlnaHQ6MCxzY3JvbGxEaXJlY3Rpb246MH0sZXZlbnRzOnsidWk6dG9nZ2xlLWNhcmQiOmZ1bmN0aW9uKCl7dmFyIGI9CiF0aGlzLmRhdGEuZ2V0KCJleHBhbmRlZCIpO3RoaXMuZGF0YS5zZXQoImV4cGFuZGVkIixiKTtifHx0aGlzLmRhdGEuc2V0KCJwaW5uZWQiLCExKTtyZXR1cm4hMX0sInVpOmV4cGFuZC1jYXJkIjpmdW5jdGlvbigpe3RoaXMuZGF0YS5zZXQoImV4cGFuZGVkIiwhMCk7cmV0dXJuITF9LCJjYXJkOnVwZGF0ZS1kb20tZGF0YSI6ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmdGhpcy5kYXRhLnNldChlLGJbZV0pfSwiY2FyZExpc3Q6cmVmcmVzaC1jYXJkIjpmdW5jdGlvbihiLGUpe2lmKHRoaXMuZGF0YS5nZXQoImlkIik9PT1iKXt2YXIgYz10aGlzLmRhdGEuZ2V0KCJjYXJkRWwiKTtiPXRoaXMuZGF0YS5nZXQoImNhbnZhc1RvcCIpO3ZhciBkPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseT1jLnF1ZXJ5U2VsZWN0b3IoZy5zZWxlY3RvcnMuQ0FSRF9IRUFERVIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9e19jYXJkUmVjdDpkLF9oZWFkZXJSZWN0OnksCmlzQWJvdmVDYW52YXM6ZC5ib3R0b208Yixpc0JvdHRvbVRvdWNoQ2FudmFzVG9wOmMuYm90dG9tPT09Yixpc1Zpc2libGVIZWlnaHRMZXNzVGhhblBpbm5lZEhlYWRlcjpkLmJvdHRvbS1iPGcuQ0FSRF9QSU5ORURfSEVBREVSX1NJWkUsaXNDdXRCeUNhbnZhc1RvcDpkLnRvcDxiJiZiPGQuYm90dG9tLGlzVG9wVG91Y2hpbmdDYW52YXNUb3A6ZC50b3A9PT1iLGlzVG9wQmVsb3dDYW52YXNUb3A6YjxkLnRvcH07Yy5pc1Zpc2libGVIZWlnaHRMZXNzVGhhblBpbm5lZEhlYWRlciYmKGMudmlzaWJsZUhlaWdodD1kLmJvdHRvbS1iKTt0aGlzLmRhdGEuZ2V0KCJwaW5uZWQiKT8oZT1lPT09Zy5DQVJEX1VQP2E6ayxlKGMpJiZ0aGlzLmRhdGEuc2V0KCJwaW5uZWQiLCExKSk6KGU9ZT09PWcuQ0FSRF9VUD90OnYsZShjKSYmdGhpcy5kYXRhLnNldCgicGlubmVkIiwhMCkpO3RoaXMuZGF0YS5nZXQoInBpbm5lZCIpJiZ0aGlzLmRhdGEuc2V0KCJwaW5uZWRNb2RlIixjLmlzVmlzaWJsZUhlaWdodExlc3NUaGFuUGlubmVkSGVhZGVyPwpnLlBJTk5FRF9BU19SRUxBVElWRTpnLlBJTk5FRF9BU19GSVhFRCl9fSwiY2FyZExpc3Q6dXBkYXRlLWNhbnZhcy10b3AiOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YS5zZXQoImNhbnZhc1RvcCIsYil9fSxsaWZlY3ljbGU6e3JlbmRlcjpmdW5jdGlvbigpe3RoaXMuZGF0YS5nZXQoImV4cGFuZGFibGUiKSYmKHRoaXMuZGF0YS5iaW5kKCJleHBhbmRlZCBjYW52YXNUb3AiKSx0aGlzLmRhdGEuYmluZCgicGlubmVkIix7YmF0Y2g6ITF9KSx0aGlzLmRhdGEuYmluZCgicGlubmVkTW9kZSIse2JhdGNoOiExfSkpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4oKS5zaG93KCl9fSx2aWV3OntyZW5kZXI6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3ZhciBhPWIuY3VycmVudFRhcmdldDtiPWgoYi50YXJnZXQsZnVuY3Rpb24oYil7cmV0dXJuIGI9PT1hfSx7MDpmdW5jdGlvbihiKXtyZXR1cm4iYSI9PT1iLnRhZ05hbWUudG9Mb3dlckNhc2UoKXx8Yi5jbGFzc0xpc3QuY29udGFpbnMoImFvay1jYXJkLWFsbG93LWludGVyYWN0aW9uIil9LAoxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmNsYXNzTGlzdC5jb250YWlucygiYS1jYXJkLWhlYWRlciIpfX0pOyIwIiE9PWImJigiMSI9PT1iP20uZGlzcGF0Y2goInVpOnRvZ2dsZS1jYXJkIik6bS5kYXRhLmdldCgiZXhwYW5kZWQiKXx8bS5kaXNwYXRjaCgidWk6ZXhwYW5kLWNhcmQiKSl9dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRhdGEuZ2V0KCJzZWxlY3RvciIpKSxhPWUucXVlcnlTZWxlY3RvcihnLnNlbGVjdG9ycy5DQVJEX0hFQURFUiksYz1lLnF1ZXJ5U2VsZWN0b3IoZy5zZWxlY3RvcnMuQ0FSRF9CT0RZKSxkPWUucXVlcnlTZWxlY3RvcihnLnNlbGVjdG9ycy5DQVJEX0ExMVlfTEFCRUwpLHU9dGhpcy5kYXRhLmdldCgiZXhwYW5kYWJsZSIpLG09dGhpcyxmPXRoaXMuZGF0YS5nZXQoImhhc1BlZWsiKSYmZCxsPXtjYXJkRWw6ZSxoZWFkZXJFbDphLGJvZHlFbDpjLGExMXlMYWJlbEVsOmQsc2hvdWxkTWFpbnRhaW5BMTF5TGFiZWw6Zn07aWYoYSl7dmFyIHA9CmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bC51bnBpbm5lZEhlYWRlckhlaWdodD1wLmhlaWdodH10aGlzLmRpc3BhdGNoKCJjYXJkOnVwZGF0ZS1kb20tZGF0YSIsbCk7dSYmZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYik7ZS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1leHBhbmRlZCIpJiZtLmRpc3BhdGNoKCJ1aTpleHBhbmQtY2FyZCIpO3UmJih1PXRoaXMuZGF0YS5nZXQoImlkIikrZy5DQVJEX0JPRFlfSURfU1VGRklYLGMuc2V0QXR0cmlidXRlKCJpZCIsdSksYS5zZXRBdHRyaWJ1dGUoImFyaWEtY29udHJvbHMiLHUpKTtmJiYoYz10aGlzLmRhdGEuZ2V0KCJpZCIpK2cuQ0FSRF9QRUVLX0RFU0NSSVBUSU9OX1NVRkZJWCxkLnNldEF0dHJpYnV0ZSgiaWQiLGMpLHEoYSxkLHRoaXMuZGF0YS5nZXQoImV4cGFuZGVkIikpKTt0aGlzLnNldEVsZW1lbnQoZSl9LHNob3c6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9dGhpcy5nZXRFbGVtZW50KCksbj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLApmPXRoaXMuZGF0YS5nZXQoImhlYWRlckVsIikseT10aGlzLmRhdGEuZ2V0KCJib2R5RWwiKSx1PXRoaXMuZGF0YS5nZXQoImExMXlMYWJlbEVsIiksbT10aGlzLmRhdGEuZ2V0KCJ1bnBpbm5lZEhlYWRlckhlaWdodCIpLGg9dGhpcy5kYXRhLmdldCgicGlubmVkIiksbD10aGlzLmRhdGEuZ2V0KCJleHBhbmRlZCIpLHA9dGhpcy5kYXRhLmdldCgiY2FudmFzVG9wIiksaz10aGlzLmRhdGEuZ2V0KCJwaW5uZWRNb2RlIikscj10aGlzLmRhdGEuZ2V0KCJpc0R5bmFtaWNDYXJkSGVpZ2h0Iik7dGhpcy5kYXRhLmdldCgiaGFzUGVlayIpO3ZhciB0PWIucGlubmVkJiZoLHY9Yi5waW5uZWQmJiFoLHc9ISFiLmV4cGFuZGVkO2I9dyYmbDt2YXIgeD13JiYhbCxuPW4uYm90dG9tPHAsej10aGlzLmRhdGEuZ2V0KCJzaG91bGRNYWludGFpbkExMXlMYWJlbCIpO2MoYSwiYW9rLWNhcmQtZXhwYW5kZWQiLGwpO2MoYSwiYS1jYXJkLWV4cGFuZGVkIixsKTtjKGEsImFvay1jYXJkLWNvbGxhcHNlZCIsCiFsKTtjKGEsImEtY2FyZC1jb2xsYXBzZWQiLCFsKTtjKGEsImEtY2FyZC1waW5uZWQiLGgpO2MoYSwiYS1jYXJkLXBpbm5lZC1maXhlZCIsaCYmaz09PWcuUElOTkVEX0FTX0ZJWEVEKTtjKGEsImEtY2FyZC1waW5uZWQtcmVsYXRpdmUiLGgmJms9PT1nLlBJTk5FRF9BU19SRUxBVElWRSk7Zi5zdHlsZS50b3A9az09PWcuUElOTkVEX0FTX0ZJWEVEP3ArInB4IjoiIjtyP2MoYSwiYS1jYXJkLWFib3ZlLWNhbnZhcyIsbik6dD9hLnN0eWxlLnBhZGRpbmdUb3A9bSsicHgiOnYmJihhLnN0eWxlLnBhZGRpbmdUb3A9MCk7bj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2E9ZC52aWV3cG9ydCgpLmhlaWdodDtoPW4udG9wPHA7az1hPG4uYm90dG9tO3I9MDt0JiZ0aGlzLmRpc3BhdGNoKCJjYXJkOnVwZGF0ZWQtcGlubmVkLWluZGV4Iix0aGlzLmRhdGEuZ2V0KCJpZHgiKSk7aCYmKGJ8fHgpP3I9Zy5DQVJEX0RPV04qKHAtbi50b3ApOmsmJmImJihyPU1hdGgubWluKG4uaGVpZ2h0LG0rMioKZy5DQVJEX1BFRUtfU0laRSkscj1nLkNBUkRfVVAqKHItKGEtbi50b3ApKSk7ciYmdGhpcy5kaXNwYXRjaCgiY2FyZDpzY3JvbGwtY2FyZC1saXN0LXVwIixyKTt3JiYobT1iPyJleHBhbmQiOiJjb2xsYXBzZSIscD10aGlzLmRhdGEuZ2V0KCJpZCIpLGQudHJpZ2dlcigiYTpjYXJkOiIrbSx7Y2FyZDpwfSksZC50cmlnZ2VyKCJhOmNhcmQ6IitwKyI6IittKSxmLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsbCkseS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwhbCkseiYmcShmLHUsYikpfX19fSl9KTsidXNlIHN0cmljdCI7Zi53aGVuKCJBIiwiYS1zYyIsImEtY2FyZC1jb21wb25lbnQiLCJwcnY6YS1jYXJkLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcmQtbGlzdCIsZnVuY3Rpb24oZCxmLGcsaCl7ZnVuY3Rpb24gayhhKXtmb3IodmFyIGM9MDthOylpc05hTihhLm9mZnNldFRvcCl8fChjKz1hLm9mZnNldFRvcCksYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gY31mdW5jdGlvbiB0KGEpe2E9CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSk7dmFyIGM9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gayhhKStjLmhlaWdodH1mdW5jdGlvbiB4KGEpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgYj1jLnRhcmdldDthKGMsYi5zY3JvbGxUb3A+dj9oLkNBUkRfVVA6aC5DQVJEX0RPV04pO3Y9Yi5zY3JvbGxUb3B9fXZhciB2PTA7cmV0dXJuIGYuZGVmaW5lKHtjb21wb25lbnRzOntjYXJkczpnLnRvQ29sbGVjdGlvbigpfSxkYXRhOntoZWFkZXJTZWxlY3RvcjoiaGVhZGVyIixzZWxlY3RvcjpoLnNlbGVjdG9ycy5DQVJEX0xJU1QsY2FyZFNlbGVjdG9yOmguc2VsZWN0b3JzLkNBUkQsY2FudmFzVG9wOjAsY2FyZExpc3RTY3JvbGxUb3A6MCxjYXJkTGlzdFNjcm9sbFRvcERlbHRhOjAscGlubmVkSW5kZXg6bnVsbCxpc0R5bmFtaWNDYXJkSGVpZ2h0OiEwLGNhcmRTdGF0ZUNvbGxlY3Rpb246W119LGV2ZW50czp7InVpOnNjcm9sbC1jYXJkLWxpc3QiOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YS5zZXQoImNhcmRMaXN0U2Nyb2xsVG9wIiwKYSl9LCJ1aTp1cGRhdGUtY2FudmFzLXRvcCI6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhLnNldCgiY2FudmFzVG9wIixhKTt0aGlzLmJyb2FkY2FzdCgiY2FyZExpc3Q6dXBkYXRlLWNhbnZhcy10b3AiLGEpfSwidWk6cmVmcmVzaC1jYXJkIjpmdW5jdGlvbihhLGMpe3RoaXMuYnJvYWRjYXN0KCJjYXJkTGlzdDpyZWZyZXNoLWNhcmQiLGEsYyl9LCJjYXJkOnVwZGF0ZWQtcGlubmVkLWluZGV4IjpmdW5jdGlvbihhKXt0aGlzLmRhdGEuc2V0KCJwaW5uZWRJbmRleCIsYSl9LCJjYXJkOnNjcm9sbC1jYXJkLWxpc3QtdXAiOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YS5zZXQoImNhcmRMaXN0U2Nyb2xsVG9wRGVsdGEiLGEpfSwiY2FyZExpc3Q6dXBkYXRlLWRvbS1kYXRhIjpmdW5jdGlvbihhKXtmb3IodmFyIGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiZ0aGlzLmRhdGEuc2V0KGMsYVtjXSl9fSxsaWZlY3ljbGU6e3JlbmRlcjpmdW5jdGlvbigpe3RoaXMuZGF0YS5iaW5kKCJjYXJkTGlzdFNjcm9sbFRvcCIsCntiYXRjaDohMX0pO3RoaXMuZGF0YS5iaW5kKCJjYXJkTGlzdFNjcm9sbFRvcERlbHRhIix7YmF0Y2g6ITF9KTt2YXIgYT10KHRoaXMuZGF0YS5nZXQoImhlYWRlclNlbGVjdG9yIikpO3RoaXMuZGF0YS5zZXQoImNhbnZhc1RvcCIsYSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbGxlY3Rpb24oImNhcmRzIiksYz10aGlzLmRhdGEuZ2V0KCJjYXJkU3RhdGVDb2xsZWN0aW9uIiksYj10aGlzLmRhdGEuZ2V0KCJjYW52YXNUb3AiKSxlPXRoaXMuZGF0YS5nZXQoImlzRHluYW1pY0NhcmRIZWlnaHQiKTtkLmVhY2goYyxmdW5jdGlvbihjKXtjPWQuZXh0ZW5kKGMse2NhbnZhc1RvcDpiLGlzRHluYW1pY0NhcmRIZWlnaHQ6ZX0pO2EuYXBwZW5kKGMpfSk7cmV0dXJuIGEuc2hvdygpfX0sdmlldzp7cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRhdGEuZ2V0KCJzZWxlY3RvciIpKSxjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEucXVlcnlTZWxlY3RvckFsbCh0aGlzLmRhdGEuZ2V0KCJjYXJkU2VsZWN0b3IiKSkpOwp0aGlzLmRhdGEuZ2V0KCJjYW52YXNUb3AiKTt2YXIgYj10aGlzLmRhdGEuZ2V0KCJoZWFkZXJTZWxlY3RvciIpLGU9dGhpcyxmPVtdO2QuZWFjaChjLGZ1bmN0aW9uKGEsYil7YS5pZD1hLmlkfHwiYS1jYXJkLSIrYjtmLnB1c2goe2V4cGFuZGFibGU6YS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1leHBhbmRhYmxlIiksZXhwYW5kZWQ6YS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1leHBhbmRlZCIpLGhhc1BlZWs6YS5jbGFzc0xpc3QuY29udGFpbnMoImEtY2FyZC1oYXMtcGVlayIpLGlkOmEuaWQsaWR4OmIsc2VsZWN0b3I6IiMiK2EuaWR9KX0pO3RoaXMuZGlzcGF0Y2goImNhcmRMaXN0OnVwZGF0ZS1kb20tZGF0YSIse2NhcmRTdGF0ZUNvbGxlY3Rpb246Zn0pO3ZhciBnPXgoZnVuY3Rpb24oYSxiKXtkLmVhY2goYyxmdW5jdGlvbihhKXthLmNsYXNzTGlzdC5jb250YWlucygiYS1jYXJkLWV4cGFuZGVkIikmJmUuZGlzcGF0Y2goInVpOnJlZnJlc2gtY2FyZCIsYS5pZCwKYil9KX0pO2EuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixkLnRocm90dGxlKGcsMjApKTtxLmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIixmdW5jdGlvbigpe2QuYW5pbWF0aW9uRnJhbWVEZWxheShmdW5jdGlvbigpe3ZhciBhPXQoYik7ZS5kaXNwYXRjaCgidWk6dXBkYXRlLWNhbnZhcy10b3AiLGEpO3ZhciBkPWUuZGF0YS5nZXQoInBpbm5lZEluZGV4Iik7ZCYmKGE9ayhjW2RdKS1hLGUuZGlzcGF0Y2goInVpOnNjcm9sbC1jYXJkLWxpc3QiLGEpLGUuZGlzcGF0Y2goInVpOnNjcm9sbC1jYXJkLWxpc3QiLGEraC5DQVJEX1VQKSl9KX0pO3RoaXMuc2V0RWxlbWVudChhKX0sc2hvdzpmdW5jdGlvbihhKXtpZihhKXtkLnRyaWdnZXIoImNhcmQtbGlzdDp2aWV3OnNob3c6c3RhdGVzLWNoYW5nZSIse2NoYW5nZXM6YX0pO3ZhciBjPXRoaXMuZ2V0RWxlbWVudCgpO2EuY2FyZExpc3RTY3JvbGxUb3BEZWx0YSYmKGMuc2Nyb2xsVG9wKz10aGlzLmRhdGEuZ2V0KCJjYXJkTGlzdFNjcm9sbFRvcERlbHRhIikpOwphLmNhcmRMaXN0U2Nyb2xsVG9wJiYoYy5zY3JvbGxUb3A9dGhpcy5kYXRhLmdldCgiY2FyZExpc3RTY3JvbGxUb3AiKSl9fX19KX0pOyJ1c2Ugc3RyaWN0IjtmLndoZW4oIkEiLCJhLWNhcmQtbGlzdCIpLnJlZ2lzdGVyKCJhLWNhcmQiLGZ1bmN0aW9uKGQsZil7cmV0dXJue2luaXQ6ZnVuY3Rpb24oZCl7cmV0dXJuIGYuZ2V0SW5zdGFuY2UoZCkuc2hvdygpfX19KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24obil7dmFyIEM9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxFPUMuX25hbWVzcGFjZXx8Qy5hdHRyaWJ1dGVFcnJvcnMsZT1FP0UoIkFtYXpvblVJQ2Fyb3VzZWwiLCJBbWF6b25VSSIpOkM7ZS5ndWFyZEZhdGFsP2UuZ3VhcmRGYXRhbChuKShlLHdpbmRvdyk6ZS5leGVjdXRlKGZ1bmN0aW9uKCl7bihlLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKG4sQyxFKXtuLmRlY2xhcmUoImEtY2Fyb3VzZWwtY29uc3RhbnRzIix7QU5JTUFUSU5HOiJhbmltYXRpbmciLEFOSU1BVElPTl9TUEVFRDoiYW5pbWF0aW9uX3NwZWVkIixBVVRPX0FESlVTVF9IRUlHSFQ6ImF1dG9fYWRqdXN0X2hlaWdodCIsQ0lSQ1VMQVI6ImNpcmN1bGFyIixDVVJSRU5UX1BJWEVMOiJweCIsQ1VSUkVOVExZX1dSQVBQSU5HOiJjdXJyZW50bHlXcmFwcGluZyIsREVMQVlfVElNRToiZGVsYXlfdGltZSIsRUxFTUVOVF9DU1NfQ0xBU1M6ImVsZW1lbnRDc3NDbGFzcyIsRkVUQ0hFRF9JVEVNUzoiZmV0Y2hlZEl0ZW1zIiwKRklSU1RfVklTSUJMRV9JVEVNOiJmaXJzdFZpc2libGVJdGVtIixISURFX09GRl9TQ1JFRU46ImhpZGVfb2ZmX3NjcmVlbiIsSU5JVF9FVkVOVFM6ImE6cGFnZVVwZGF0ZSBiZWZvcmVSZWFkeSIsTE9BRElORzoibG9hZGluZyIsTUlOX0dVVFRFUjoibWluaW11bV9ndXR0ZXJfd2lkdGgiLE5BTUU6Im5hbWUiLE5PX1RSQU5TSVRJT046Im5vX3RyYW5zaXRpb24iLFBBR0VfTlVNQkVSOiJwYWdlTnVtYmVyIixQQUdFX1NJWkU6InBhZ2VTaXplIixQRUVLX0dSQURJRU5UOiJwZWVrX2dyYWRpZW50IixQRUVLX1BFUkNFTlRBR0U6InBlZWtfcGVyY2VudGFnZSIsUEVFS19XSURUSDoicGVla193aWR0aCIsU0VUX1NJWkU6InNldF9zaXplIixTUFJJTkdJTkVTUzoic3ByaW5naW5lc3MiLFNUQVRJQ19MT0FERVJfQ1NTX0NMQVNTOiJzdGF0aWNMb2FkZXJDc3NDbGFzcyIsVE9UQUxfUEFHRVM6InRvdGFsUGFnZXMiLFRPVUNIX0VBU0lORzoidG91Y2hfZWFzaW5nIixUUkFOU0lUSU9OX1NUUkFURUdZOiJ0cmFuc2l0aW9uU3RyYXRlZ3kiLApXUkFQX0VBU0lORzoid3JhcF9lYXNpbmcifSk7InVzZSBzdHJpY3QiO24ucmVnaXN0ZXIoImEtY2Fyb3VzZWwtdXRpbHMiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShkKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkfWZ1bmN0aW9uIGcoZCl7cmV0dXJuIGQmJnZvaWQgMCE9PWQubm9kZVR5cGV9ZnVuY3Rpb24gayhkKXtyZXR1cm4iIj09PWQ/Ilx4M2NkaXZceDNlXHgzYy9kaXZceDNlIjpkP2UoZCl8fGcoZCk/ZDprKGQuY29udGVudCk6bnVsbH1mdW5jdGlvbiBmKGQpe2QmJihlKGQpfHxnKGQpP2Q9ITA6ZC5jb250ZW50PWYoZC5jb250ZW50KSk7cmV0dXJuIGR9cmV0dXJue2FkZEVsZW1lbnRUb0RvbTpmdW5jdGlvbihkLGYpe2YmJihlKGYpP2QuaHRtbChmKTpnKGYpJiZkLmVtcHR5KCkuYXBwZW5kKGYpLCEwIT09ZiYmZC5yZW1vdmVDbGFzcygiYS1jYXJvdXNlbC1jYXJkLWVtcHR5IikpfSxjbGVhckVsZW1lbnRGcm9tSXRlbTpmLGdldEVsZW1lbnRGcm9tSXRlbTprLGlzRWxlbWVudDpnLAppc1N0cmluZzplfX0pOyJ1c2Ugc3RyaWN0IjtuLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWNpcmN1bGFyLXV0aWxzIixmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIGY9MDxlO3JldHVybiBmdW5jdGlvbihkLGUsbCl7dmFyIGI9ZS5sZW5ndGg7bD0obHx8MSklYjtkPWQuZ2V0KDApO2Zvcih2YXIgYyxhPTA7YTxsO2ErKylmPyhjPWUuZ2V0KGEpLGQuYXBwZW5kQ2hpbGQoYykpOihjPWUuZ2V0KGItMS1hKSxkLmluc2VydEJlZm9yZShjLGQuY2hpbGRyZW5bMF0pKX19ZnVuY3Rpb24gZyhlKXt2YXIgZj0wPGU7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7ZT1lP2UlZC5sZW5ndGg6MTtmP2Q9ZC5jb25jYXQoZC5zcGxpY2UoMCxlKSk6ZC51bnNoaWZ0LmFwcGx5KGQsZC5zcGxpY2UoZC5sZW5ndGgtZSxlKSk7cmV0dXJuIGR9fXJldHVybntyb3RhdGVDVzplKDEpLHJvdGF0ZUNDVzplKC0xKSxyb3RhdGVBcnJheUNXOmcoMSkscm90YXRlQXJyYXlDQ1c6ZygtMSksZmlyc3RDYXJkSW5kZXhBZnRlclJvdGF0ZTpmdW5jdGlvbihlLApmLGQpe2U9KGYrZSklZDswPT09ZT9lPWQ6MD5lJiYoZT1kK2UpO3JldHVybiBlfSxyZWxhdGl2ZUluZGV4RnJvbUluZGV4OmZ1bmN0aW9uKGUsZixkKXt2YXIgaD0xO2lmKDA8ZSYmZTw9ZClyZXR1cm4gZT5mP2g9ZS1mKzE6ZTxmJiYoaD1kLWYrZSsxKSxoO24uZXJyb3IoImlkeCBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAiK2QsImEtY2Fyb3VzZWwtY2lyY3VsYXItdXRpbHMiLCJyZWxhdGl2ZUluZGV4RnJvbUluZGV4Iil9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1tZWFzdXJlIixmdW5jdGlvbihlLGcpe3JldHVybiBmdW5jdGlvbihrKXtmdW5jdGlvbiBmKGQsZixiKXt2YXIgYyxhLHEsdTtmLmpxdWVyeXx8KGY9ZyhmKSk7Zm9yKGUuZWFjaChiLGZ1bmN0aW9uKHEpe2lmKCJ0b3AiPT09cXx8ImxlZnQiPT09cSlyZXR1cm4gYT1mLm9mZnNldCgpLCExfSk7dm9pZCAwIT09KGM9Yi5wb3AoKSk7KXE9ZFtjXSwibGVmdCI9PT0KY3x8InRvcCI9PT1jP2RbY109YVtjXTotMTxjLmluZGV4T2YoIm91dGVyIik/ZFtjXT1mW2NdKCEwKTpkW2NdPWZbIm91dGVyIitjLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Muc3Vic3RyKDEpXSgpLGRbY10hPT1xJiYodm9pZCAwPT09dSYmKHU9e30pLHVbY109cSk7cmV0dXJuIHV9dmFyIGQ9e2Nhcm91c2VsOntoZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfSx2aWV3cG9ydDp7aGVpZ2h0OjAsd2lkdGg6MCxvdXRlckhlaWdodDowLG91dGVyV2lkdGg6MH0saXRlbXM6W10sZ2V0Rmlyc3RDYXJkV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5pdGVtc1swXSYmZS5pc0Zpbml0ZU51bWJlcih0aGlzLml0ZW1zWzBdLndpZHRoKT90aGlzLml0ZW1zWzBdLndpZHRoOjE2MH19O2subWVhc3VyZT1mdW5jdGlvbihoKXt2YXIgbD10aGlzLmRvbS4kY2Fyb3VzZWwsYj10aGlzLmRvbS4kdmlld3BvcnQsYz17fTtoJiYoaD1oLnNwbGl0KCIgIikpOwppZighaHx8LTE8ZS5pbmRleE9mQXJyYXkoaCwiY2Fyb3VzZWwiKSljLmNhcm91c2VsPWYoZC5jYXJvdXNlbCxsLCJ0b3AgbGVmdCBoZWlnaHQgd2lkdGggb3V0ZXJIZWlnaHQgb3V0ZXJXaWR0aCIuc3BsaXQoIiAiKSk7aWYoIWh8fC0xPGUuaW5kZXhPZkFycmF5KGgsInZpZXdwb3J0IikpYy52aWV3cG9ydD1mKGQudmlld3BvcnQsYixbImhlaWdodCIsIndpZHRoIiwib3V0ZXJIZWlnaHQiLCJvdXRlcldpZHRoIl0pO2lmKCFofHwtMTxlLmluZGV4T2ZBcnJheShoLCJpdGVtcyIpKWQuaXRlbXM9W10sYy5pdGVtcz17fSxsLmNoaWxkcmVuKCJsaSIpLmVhY2goZnVuY3Rpb24oYSxxKXtkLml0ZW1zW2FdPXt9O3E9ZihkLml0ZW1zW2FdLHEsInRvcCBsZWZ0IGhlaWdodCB3aWR0aCBvdXRlckhlaWdodCBvdXRlcldpZHRoIi5zcGxpdCgiICIpKTt2b2lkIDAhPT1xJiYoYy5pdGVtc1thXT1xKX0pO3JldHVybiBjfTtrLmdldEl0ZW1PZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIGY9ZC5pdGVtczsKZS0tO2lmKGYmJmYubGVuZ3RoKXtpZihlPGYubGVuZ3RoKXtmb3IodmFyIGI9MCxjPWZbMF0ub3V0ZXJXaWR0aCxhPTA7YTxlO2ErKyliKz1mW2FdP2ZbYV0ub3V0ZXJXaWR0aDpjOzA8ZSYmdGhpcy5nZXRBdHRyKCJmaXJzdF9pdGVtX2ZsdXNoX2xlZnQiKSYmKGIrPWsuZ2V0QXR0cigiY3VycmVudEd1dHRlciIpKTtyZXR1cm4gYn19ZWxzZSByZXR1cm4gMH07ay5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGUuY29weShkKX07ay51cGRhdGVEaW1lbnNpb25zQ2FjaGU9ZnVuY3Rpb24oZil7ZS5leHRlbmQoZCxmKX07ay5nZXRWaWV3cG9ydFdpZHRoPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBkLnZpZXdwb3J0LndpZHRofWNhdGNoKGUpe319fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1hdHRyaWJ1dGVzIixmdW5jdGlvbihlLGcpe3JldHVybiBmdW5jdGlvbihrLGYpe3ZhciBkPXt9LGg9e30sbD17fTtlLmV4dGVuZChkLApmKTtrLm9uQ2hhbmdlPWZ1bmN0aW9uKGIsYyl7Yj1iLnNwbGl0KCIgIik7Zm9yKHZhciBhPWIubGVuZ3RoLHE7YS0tOylxPWJbYV0saFtxXXx8KGhbcV09W10pLGcuaXNGdW5jdGlvbihjKSYmLTE9PT1lLmluZGV4T2ZBcnJheShoW3FdLGMpJiZoW3FdLnB1c2goYyk7cmV0dXJuIHRoaXN9O2sudW5iaW5kPWZ1bmN0aW9uKGIsYyl7aFtiXSYmYyYmKGM9ZS5pbmRleE9mQXJyYXkoaFtiXSxjKSwtMTxjJiZoW2JdLnNwbGljZShjLDEpKTtyZXR1cm4gdGhpc307ay5vbmNlPWZ1bmN0aW9uKGIsYyl7dmFyIGE9ZnVuY3Rpb24oKXtjLmFwcGx5KG51bGwsYXJndW1lbnRzKTtrLnVuYmluZChiLGEpfTtyZXR1cm4gay5vbkNoYW5nZShiLGEpfTtrLnNldEF0dHI9ZnVuY3Rpb24oYixjLGEpe3ZhciBxPWRbYl07ZFtiXT1jO2lmKCEoYXx8bFtiXXx8ZS5lcXVhbHMoYyxxKSkpe2xbYl09ITA7Yz1lLmNvcHkoYyk7cT1lLmNvcHkocSk7aWYoaFtiXSl7YT1lLmNvcHkoaFtiXSk7Zm9yKHZhciB1PTAsCnA9YS5sZW5ndGg7dTxwO3UrKylhW3VdKGMscSxrLGIpfWM9e25ld1ZhbHVlOmMsb2xkVmFsdWU6cSxjYXJvdXNlbDprfTtlLnRyaWdnZXIoImE6Y2Fyb3VzZWw6Y2hhbmdlOiIrYixjKTtkLm5hbWUmJmUudHJpZ2dlcigiYTpjYXJvdXNlbDoiK2QubmFtZSsiOmNoYW5nZToiK2IsYyk7bFtiXT0hMX1yZXR1cm4gdGhpc307ay5nZXRBdHRyPWZ1bmN0aW9uKGIpe3JldHVybiBlLmNvcHkoZFtiXSl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLW1lYXN1cmUiLCJhLWNhcm91c2VsLWF0dHJpYnV0ZXMiLCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWJhc2UiLGZ1bmN0aW9uKGUsZyxrLGYsZCxoKXtmdW5jdGlvbiBsKGEpe3ZhciBjPWEuZ2V0QXR0cigic2V0X3NpemUiKTw9YS5nZXRBdHRyKCJwYWdlU2l6ZSIpLGI9YS5nZXRBdHRyKGguTk9fVFJBTlNJVElPTik7MT09PQphLmdldEF0dHIoInRvdGFsUGFnZXMiKSYmMTxhLmdldEF0dHIoInBhZ2VOdW1iZXIiKSYmYS5nb3RvUGFnZSgxLHtzdGFydG92ZXI6ITAsYW5pbWF0aW9uRHVyYXRpb246MH0pO2EuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtbGVmdCwgLmEtY2Fyb3VzZWwtcmlnaHQiKS5jc3MoInZpc2liaWxpdHkiLGN8fGI/ImhpZGRlbiI6InZpc2libGUiKX1mdW5jdGlvbiBiKGEsYyl7cmV0dXJuIGlzTmFOKGEpPyhuLmxvZygiYHNldF9zaXplYCBzaG91bGQgYmUgYW4gaW50ZWdlcjogIithLCJXQVJOIiwiYXVpOmNhcm91c2VsOmJhc2UiKSxjKTpwYXJzZUludChhLDEwKX1mdW5jdGlvbiBjKGEpe2Eub25DaGFuZ2UoInBhZ2VTaXplIixmdW5jdGlvbihjLGIpe3ZhciBlPWEuZ2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIpLGQ9TWF0aC5jZWlsKGUvYyk7MT09PWQmJjE8ZT9kPTI6MT5kJiYoZD0xKTthLnNldEF0dHIoInBhZ2VOdW1iZXIiLGQpO2Euc2V0QXR0cigidG90YWxQYWdlcyIsCk1hdGguY2VpbChhLmdldEF0dHIoInNldF9zaXplIikvYykpO2U9YS5nZXRBdHRyKCJhamF4Iik7Yz5iJiYoZSYmZS5wcmVmZXRjaF9uZXh0X3BhZ2U/YS5zdHJhdGVnaWVzLmFqYXgud2FudE5leHRQYWdlKGEpOmEuc3RyYXRlZ2llcy5hamF4LndhbnRDdXJyZW50UGFnZShhKSl9KTthLm9uQ2hhbmdlKCJzZXRfc2l6ZSIsZnVuY3Rpb24oYyxiKXt2YXIgZT1hLmdldEF0dHIoInBhZ2VTaXplIiksZD1hLmdldEF0dHIoImZldGNoZWRJdGVtcyIpO2Euc2V0QXR0cigidG90YWxQYWdlcyIsTWF0aC5jZWlsKGMvZSkpO2M8Yj8oZC5zcGxpY2UoYyxOdW1iZXIuTUFYX1ZBTFVFKSxhLnNldEF0dHIoImZldGNoZWRJdGVtcyIsZCkpOmEuc3RyYXRlZ2llcy5hamF4LndhbnRDdXJyZW50UGFnZSYmYS5zdHJhdGVnaWVzLmFqYXgud2FudEN1cnJlbnRQYWdlKGEpfSk7YS5vbkNoYW5nZSgiZmlyc3RWaXNpYmxlSXRlbSIsZnVuY3Rpb24oYyl7YS5kb20uJGNvbnRhaW5lci5maW5kKCJpbnB1dC5hLWNhcm91c2VsLWZpcnN0dmlzaWJsZWl0ZW0iKS52YWwoYyl9KTsKYS5vbkNoYW5nZSgicGFnZU51bWJlciIsZnVuY3Rpb24oYyl7MDxjJiZjPD1hLmdldEF0dHIoInRvdGFsUGFnZXMiKSYmYS5zZXRBdHRyKCJjdXJyZW50bHlXcmFwcGluZyIsITEpfSl9ZnVuY3Rpb24gYShhLGMsZCl7aWYoMCE9PWFyZ3VtZW50cy5sZW5ndGgpe2EuanF1ZXJ5fHwoYT1nKGEpKTt0aGlzLmRvbT17JGNvbnRhaW5lcjphLCR2aWV3cG9ydDphLmhhc0NsYXNzKCJhLWNhcm91c2VsLXZpZXdwb3J0Iik/YTphLmZpbmQoIi5hLWNhcm91c2VsLXZpZXdwb3J0IiksJGNhcm91c2VsOmEuZmluZCgiLmEtY2Fyb3VzZWwiKX07dmFyIG09e3RvdGFsUGFnZXM6MUUzLHBhZ2VOdW1iZXI6MSxwYWdlU2l6ZTowLGZpcnN0VmlzaWJsZUl0ZW06MSxtYWludGFpbl9zdGF0ZTohMCxweDowLGF1dG9fYWRqdXN0X2hlaWdodDohMCxhamF4Ont9fTtlLmV4dGVuZChtLGQpO20ubWFpbnRhaW5fc3RhdGU9ISFtLm1haW50YWluX3N0YXRlO20uaWRfbGlzdD9tLnNldF9zaXplfHwobS5zZXRfc2l6ZT0KbS5pZF9saXN0Lmxlbmd0aCk6bS5pZF9saXN0PVtdO3ZhciBsPXRoaXMuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKTtpZihtLnNldF9zaXplKW0uc2V0X3NpemU9YihtLnNldF9zaXplLGwubGVuZ3RoKTtlbHNle3ZhciBoPXBhcnNlSW50KGwuZmlyc3QoKS5hdHRyKCJhcmlhLXNldHNpemUiKSwxMCk7ZS5pc0Zpbml0ZU51bWJlcihoKSYmMDxoP20uc2V0X3NpemU9aDptLnNldF9zaXplPWwubGVuZ3RofXZhciByPVtdO3RoaXMuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5lYWNoKGZ1bmN0aW9uKGEsYyl7ci5wdXNoKGUudHJpbShjLmlubmVySFRNTCkpfSk7bS5mZXRjaGVkSXRlbXM9cjtrKHRoaXMpO2YodGhpcyxtKTt0aGlzLnN0cmF0ZWdpZXM9YztyZXR1cm4gdGhpc319ZS5lYWNoKGQsZnVuY3Rpb24oYyxiKXthLnByb3RvdHlwZVsic2V0IitiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSkrIlN0cmF0ZWd5Il09ZnVuY3Rpb24oYSl7dGhpcy5zdHJhdGVnaWVzW25hbWVdPQphOyJmdW5jdGlvbiI9PT10eXBlb2YgYS5pbml0JiZhLmluaXQodGhpcyl9fSk7ZD1hLnByb3RvdHlwZTtkLmdvdG9OZXh0UGFnZT1mdW5jdGlvbihhKXt0aGlzLmdldEF0dHIoInRyYW5zaXRpb25QYXVzZWQiKXx8KHRoaXMuc3RyYXRlZ2llcy50cmFuc2l0aW9uLmdvdG9OZXh0UGFnZSh0aGlzLGEpLGEmJmEuYWNjZXNzaWJsZVNhZmUmJnRoaXMuc3RyYXRlZ2llcy5hY2Nlc3NpYmlsaXR5Lm5leHRQYWdlKHRoaXMsYS5hbmltYXRpb25EdXJhdGlvbixhLmFuaW1hdGlvblNwZWVkKSl9O2QuZ290b1ByZXZQYWdlPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0QXR0cigidHJhbnNpdGlvblBhdXNlZCIpfHwodGhpcy5zdHJhdGVnaWVzLnRyYW5zaXRpb24uZ290b1ByZXZQYWdlKHRoaXMsYSksYSYmYS5hY2Nlc3NpYmxlU2FmZSYmdGhpcy5zdHJhdGVnaWVzLmFjY2Vzc2liaWxpdHkucHJldlBhZ2UodGhpcyxhLmFuaW1hdGlvbkR1cmF0aW9uLGEuYW5pbWF0aW9uU3BlZWQpKX07ZC5nb3RvUGFnZT0KZnVuY3Rpb24oYSxjKXt0aGlzLmdldEF0dHIoInRyYW5zaXRpb25QYXVzZWQiKXx8KHRoaXMuc3RyYXRlZ2llcy50cmFuc2l0aW9uLmdvdG9QYWdlKHRoaXMsYSxjKSxjJiZjLmFjY2Vzc2libGVTYWZlJiZ0aGlzLnN0cmF0ZWdpZXMuYWNjZXNzaWJpbGl0eS5nb3RvUGFnZSh0aGlzLGMuYW5pbWF0aW9uRHVyYXRpb24sYy5hbmltYXRpb25TcGVlZCkpfTtkLmdvdG9JbmRleD1mdW5jdGlvbihhLGMpeyghdGhpcy5nZXRBdHRyKCJ0cmFuc2l0aW9uUGF1c2VkIil8fGMmJmMuaWdub3JlUGF1c2UpJiZ0aGlzLnN0cmF0ZWdpZXMudHJhbnNpdGlvbi5nb3RvSW5kZXgodGhpcyxhLGMpfTtkLmdvdG9QaXhlbD1mdW5jdGlvbihhLGMpe3RoaXMuZ2V0QXR0cigidHJhbnNpdGlvblBhdXNlZCIpfHx0aGlzLnN0cmF0ZWdpZXMudHJhbnNpdGlvbi5nb3RvUGl4ZWwodGhpcyxhLGMpfTtkLnJlc2l6ZT1mdW5jdGlvbigpe2lmKHRoaXMuZG9tLiRjb250YWluZXIuaXMoIjp2aXNpYmxlIikpe3ZhciBhPQp0aGlzLm1lYXN1cmUoImNhcm91c2VsIHZpZXdwb3J0Iik7dGhpcy5zdHJhdGVnaWVzLmRpc3BsYXkucmVzaXplKHRoaXMsYSl9fTtkLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyKCJ0cmFuc2l0aW9uUGF1c2VkIiwhMCl9O2QucmVzdW1lPWZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyKCJ0cmFuc2l0aW9uUGF1c2VkIiwhMSl9O2QudHJpZ2dlckV2ZW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHx7fTtjLmNhcm91c2VsPXRoaXM7ZS50cmlnZ2VyKCJhOmNhcm91c2VsOiIrYSxjKTt2YXIgYj10aGlzLmdldEF0dHIoIm5hbWUiKTtiJiZlLnRyaWdnZXIoImE6Y2Fyb3VzZWw6IitiKyI6IithLGMpfTtkLmdldFN0YXRpY0xvYWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEF0dHIoaC5TVEFUSUNfTE9BREVSX0NTU19DTEFTUyk/J1x4M2NkaXYgY2xhc3NceDNkIicrdGhpcy5nZXRBdHRyKGguU1RBVElDX0xPQURFUl9DU1NfQ0xBU1MpKyciXHgzZVx4M2MvZGl2XHgzZSc6IiJ9O2QuZ2V0RW1wdHlDYXJkPQpmdW5jdGlvbihhLGMpe3ZhciBiPSJhLWNhcm91c2VsLWNhcmQgYS1jYXJvdXNlbC1jYXJkLWVtcHR5Ijt0aGlzLmdldEF0dHIoaC5FTEVNRU5UX0NTU19DTEFTUykmJihiPWIrIiAiK3RoaXMuZ2V0QXR0cihoLkVMRU1FTlRfQ1NTX0NMQVNTKSk7cmV0dXJuWydceDNjbGkgY2xhc3NceDNkIicsYiwnIiByb2xlXHgzZCJsaXN0aXRlbSIgYXJpYS1zZXRzaXplXHgzZCInLGMsJyIgYXJpYS1wb3NpbnNldFx4M2QiJyxhLCciXHgzZScsdGhpcy5nZXRTdGF0aWNMb2FkZXIoKSwiXHgzYy9saVx4M2UiXS5qb2luKCIiKX07ZC5pbml0VG91Y2hIYW5kbGluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1hLmRvbS4kdmlld3BvcnQ7KGUuY2FwYWJpbGl0aWVzLnRvdWNofHxlLmNhcGFiaWxpdGllcy5wb2ludGVyUHJlZml4KSYmbi53aGVuKCJhLXRvdWNoIikuZXhlY3V0ZShmdW5jdGlvbihiKXtjLmFkZENsYXNzKCJhLWdlc3R1cmUgYS1nZXN0dXJlLWhvcml6b250YWwiKS5iaW5kKCJwYW4taG9yaXpvbnRhbCBzd2lwZS1ob3Jpem9udGFsIiwKZnVuY3Rpb24oKXtyZXR1cm4hMX0pO2Uub24oImE6c3dpcGUtaG9yaXpvbnRhbDoiK2NbMF0uaWQsZnVuY3Rpb24oYyl7aWYoIWEuZ2V0QXR0cigidHJhbnNpdGlvblBhdXNlZCIpJiZhLnN0cmF0ZWdpZXMudHJhbnNpdGlvbi5vblN3aXBlKWEuc3RyYXRlZ2llcy50cmFuc2l0aW9uLm9uU3dpcGUoYSxjKX0pO2lmKCFhLmdldEF0dHIoImRpc2FibGVfcGFubmluZyIpKWUub24oImE6cGFuLWhvcml6b250YWw6IitjWzBdLmlkLGZ1bmN0aW9uKGMpe2lmKCFhLmdldEF0dHIoInRyYW5zaXRpb25QYXVzZWQiKSYmYS5zdHJhdGVnaWVzLnRyYW5zaXRpb24ub25QYW4pYS5zdHJhdGVnaWVzLnRyYW5zaXRpb24ub25QYW4oYSxjKX0pfSk7aWYoZS5jYXBhYmlsaXRpZXMuaXNJRTEwfHxlLmNhcGFiaWxpdGllcy5pc0lFMTFQbHVzKXt2YXIgYj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpO2EucHJldmVudERlZmF1bHQoKTtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwKYiwhMCl9O2MuYmluZChlLmFjdGlvbi5zdGFydCxmdW5jdGlvbihhKXtjLmJpbmQoInN3aXBlLWhvcml6b250YWwuYS1zc2llYyBwYW4taG9yaXpvbnRhbC5hLXNzaWVjIixmdW5jdGlvbihhKXtjLnVuYmluZCgiLmEtc3NpZWMiKTtjLmJpbmQoZS5hY3Rpb24uZW5kKyIuYS1zc2llYyIsZnVuY3Rpb24oYSl7Yy51bmJpbmQoIi5hLXNzaWVjIik7ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYiwhMCl9KX0pfSl9fTtkLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5zdHJhdGVnaWVzLGQ9YS5kb20uJHZpZXdwb3J0WzBdO2QmJiFkLmlkJiYoZC5pZD0iYW5vbkNhcm91c2VsIithLl9faWQpO2Zvcih2YXIgZD1hLmRvbS4kY2Fyb3VzZWxbMF0sZj1kLmNoaWxkTm9kZXMsaD1mLmxlbmd0aDtoLS07KWZbaF0udGFnTmFtZSYmImxpIj09PWZbaF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpfHxkLnJlbW92ZUNoaWxkKGZbaF0pO2UuZWFjaChhLnN0cmF0ZWdpZXMsCmZ1bmN0aW9uKGMpe2MuaW5pdEF0dHJzJiZlLmVhY2goYy5pbml0QXR0cnMsZnVuY3Rpb24oYyxiKXt2YXIgZT1jOyJmdW5jdGlvbiI9PT10eXBlb2YgYyYmKGU9YyhhLmdldEF0dHIoYikpKTthLnNldEF0dHIoYixlKX0pfSk7aWYoMT5hLmdldEF0dHIoInNldF9zaXplIikpcmV0dXJuIGIuYWpheC5pbml0KGEpLCExO2EubWVhc3VyZSgpO2UuZWFjaChhLnN0cmF0ZWdpZXMsZnVuY3Rpb24oYyl7Yy5pbml0KGEpfSk7Yj1hLmdldEF0dHIoInBhZ2VTaXplIik7ZD1hLmdldEF0dHIoInNldF9zaXplIik7YS5zZXRBdHRyKCJ0b3RhbFBhZ2VzIixNYXRoLmNlaWwoZC9iKSk7YyhhKTthLnNldEF0dHIoImlzSW5UYWIiLDA8YS5kb20uJGNvbnRhaW5lci5jbG9zZXN0KCIuYS10YWItY29udGVudCIpLmxlbmd0aCwhMCk7YS50cmlnZ2VyRXZlbnQoImluaXQiKTtlLmVhY2goYS5zdHJhdGVnaWVzLGZ1bmN0aW9uKGMpe2MuYWZ0ZXJJbml0JiZjLmFmdGVySW5pdChhKX0pO2EudHJpZ2dlckV2ZW50KCJhZnRlckluaXQiKTsKYj1hLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKTsxPT09YiYmYS5nZXRBdHRyKCJtYWludGFpbl9zdGF0ZSIpJiYoYj1wYXJzZUludChhLmRvbS4kY29udGFpbmVyLmZpbmQoImlucHV0LmEtY2Fyb3VzZWwtZmlyc3R2aXNpYmxlaXRlbSIpLnZhbCgpLDEwKSxlLmlzRmluaXRlTnVtYmVyKGIpJiYwPGImJmI8PWR8fChiPTEpKTtpZigxPGIpe2Q9NzAwO2Y9TWF0aC5jZWlsKGIvYS5nZXRBdHRyKCJwYWdlU2l6ZSIpKTtmb3IoaD0yO2g8ZjtoKyspZCs9NzAwL2g7YS5nb3RvSW5kZXgoYix7YW5pbWF0aW9uRHVyYXRpb246ZCxlYXNpbmdGdW5jdGlvbjoiZWFzZSJ9KX1sKHRoaXMpO2Eub25DaGFuZ2UoInBhZ2VTaXplIHNldF9zaXplIixmdW5jdGlvbigpe2woYSl9KTtiPWEuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtYnV0dG9uIik7Yi5sZW5ndGgmJihkPWIuZXEoMCkucG9zaXRpb24oKS50b3ArInB4IixiLmNzcygidG9wIixkKSk7dmFyIGs9ITEsZz1mdW5jdGlvbihjKXtjLnByZXZlbnREZWZhdWx0KCk7CmM9e3N0YXJ0b3ZlcjohMCxhY2Nlc3NpYmxlU2FmZToia2V5ZG93biI9PT1jLnR5cGU/ITA6ITF9OzU8YS5nZXRBdHRyKCJwYWdlTnVtYmVyIik/Yy5hbmltYXRpb25EdXJhdGlvbj0xMjUwOmMuYW5pbWF0aW9uU3BlZWQ9NSphLmdldERpbWVuc2lvbnMoKS52aWV3cG9ydC53aWR0aDthLmdvdG9QYWdlKDEsYyl9O2EuZG9tLiRjb250YWluZXIuZGVsZWdhdGUoIi5hLWNhcm91c2VsLWdvdG8tbmV4dHBhZ2UiLCJjbGljayBkYmxjbGljayIsZnVuY3Rpb24oYyl7a3x8KGs9ITAsYy5wcmV2ZW50RGVmYXVsdCgpLGEuZ290b05leHRQYWdlKCksZS5kZWxheShmdW5jdGlvbigpe2s9ITF9LDUpKX0pLmRlbGVnYXRlKCIuYS1jYXJvdXNlbC1nb3RvLXByZXZwYWdlIiwiY2xpY2sgZGJsY2xpY2siLGZ1bmN0aW9uKGMpe2t8fChrPSEwLGMucHJldmVudERlZmF1bHQoKSxhLmdvdG9QcmV2UGFnZSgpLGUuZGVsYXkoZnVuY3Rpb24oKXtrPSExfSw1KSl9KS5kZWxlZ2F0ZSgiLmEtY2Fyb3VzZWwtZ290by1uZXh0cGFnZSIsCiJrZXlkb3duIixmdW5jdGlvbihjKXtpZihjLndoaWNoPT09ZS5jb25zdGFudHMua2V5Y29kZXMuRU5URVJ8fGMud2hpY2g9PT1lLmNvbnN0YW50cy5rZXljb2Rlcy5TUEFDRSljLnByZXZlbnREZWZhdWx0KCksYS5nb3RvTmV4dFBhZ2Uoe2FjY2Vzc2libGVTYWZlOiEwfSl9KS5kZWxlZ2F0ZSgiLmEtY2Fyb3VzZWwtZ290by1wcmV2cGFnZSIsImtleWRvd24iLGZ1bmN0aW9uKGMpe2lmKGMud2hpY2g9PT1lLmNvbnN0YW50cy5rZXljb2Rlcy5FTlRFUnx8Yy53aGljaD09PWUuY29uc3RhbnRzLmtleWNvZGVzLlNQQUNFKWMucHJldmVudERlZmF1bHQoKSxhLmdvdG9QcmV2UGFnZSh7YWNjZXNzaWJsZVNhZmU6ITB9KX0pLmRlbGVnYXRlKCIuYS1jYXJvdXNlbC1yZXN0YXJ0Iiwia2V5ZG93biIsZnVuY3Rpb24oYSl7YS53aGljaCE9PWUuY29uc3RhbnRzLmtleWNvZGVzLkVOVEVSJiZhLndoaWNoIT09ZS5jb25zdGFudHMua2V5Y29kZXMuU1BBQ0V8fGcoYSl9KS5kZWxlZ2F0ZSgiLmEtY2Fyb3VzZWwtcmVzdGFydCIsCiJjbGljayIsZyk7YS5kb20uJGNvbnRhaW5lci5maW5kKCIuYS1jYXJvdXNlbC1wYWdlLW1heCIpLmh0bWwodGhpcy5nZXRBdHRyKCJ0b3RhbFBhZ2VzIikpO3JldHVybiEwfTtyZXR1cm4gYX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLWJhc2UiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLW1vYmlsZSIsZnVuY3Rpb24oZSxnLGssZil7ZnVuY3Rpb24gZChiKXt2YXIgYz1iLmdldEF0dHIoImxvYWRlckhlaWdodCIpO2N8fCgoYz1iLmdldEF0dHIoIm1heEhlaWdodCIpKT8oYz1NYXRoLm1pbiguOSpjLDkwKSxjPU1hdGgubWF4KGMsMTIwKSk6Yz05MCxiLnNldEF0dHIoImxvYWRlckhlaWdodCIsYykpO3JldHVybiBjfWZ1bmN0aW9uIGgoYixjLGEpe2suY2FsbCh0aGlzLGIsYyxhKTtpZigwIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5nZXRBdHRyKCJjaXJjdWxhciIpPT09bCYmdGhpcy5zZXRBdHRyKCJjaXJjdWxhciIsCiExKSx0aGlzLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0Iik9PT1sJiZ0aGlzLnNldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiwhMCksdGhpcy5nZXRBdHRyKCJoaWRlX29mZl9zY3JlZW4iKT09PWwmJnRoaXMuc2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIiwhMSksdGhpcy5nZXRBdHRyKCJzcHJpbmdpbmVzcyIpPT09bCYmdGhpcy5zZXRBdHRyKCJzcHJpbmdpbmVzcyIsLjgpLHRoaXMuZ2V0QXR0cigidG91Y2hfZWFzaW5nIik9PT1sJiZ0aGlzLnNldEF0dHIoInRvdWNoX2Vhc2luZyIsImN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCkiKSx0aGlzLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gay5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpPyh0aGlzLmdldEF0dHIoZi5TVEFUSUNfTE9BREVSX0NTU19DTEFTUyl8fHRoaXMuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5jaGlsZHJlbigiLmEtbG9hZGluZy1zdGF0aWMiKS5jc3MoImhlaWdodCIsZCh0aGlzKSsKInB4IiksdGhpcy5nZXRBdHRyKGYuTk9fVFJBTlNJVElPTil8fHRoaXMuaW5pdFRvdWNoSGFuZGxpbmcoKSwhMCk6ITF9LHRoaXN9dmFyIGw7aC5wcm90b3R5cGU9bmV3IGs7aC5wcm90b3R5cGUuY29uc3RydWN0b3I9aDtoLnByb3RvdHlwZS5nZXRTdGF0aWNMb2FkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBdHRyKGYuU1RBVElDX0xPQURFUl9DU1NfQ0xBU1MpPydceDNjZGl2IGNsYXNzXHgzZCInK3RoaXMuZ2V0QXR0cihmLlNUQVRJQ19MT0FERVJfQ1NTX0NMQVNTKSsnIlx4M2VceDNjL2Rpdlx4M2UnOidceDNjZGl2IGNsYXNzXHgzZCJhLWxvYWRpbmctc3RhdGljIiBzdHlsZVx4M2QiaGVpZ2h0OicrZCh0aGlzKSsncHgiXHgzZVx4M2NkaXYgY2xhc3NceDNkImEtbG9hZGluZy1zdGF0aWMtaW5uZXIiXHgzZVx4M2MvZGl2XHgzZVx4M2MvZGl2XHgzZSd9O3JldHVybiBofSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsImEtY2Fyb3VzZWwtYmFzZSIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtZGVza3RvcCIsCmZ1bmN0aW9uKGUsZyxrLGYpe2Z1bmN0aW9uIGQoYil7dmFyIGM9Yi5nZXRBdHRyKCJzZXRfc2l6ZSIpPD1iLmdldEF0dHIoInBhZ2VTaXplIiksYT1iLmdldEF0dHIoZi5OT19UUkFOU0lUSU9OKTtiLmRvbS4kY29udGFpbmVyLmZpbmQoIi5hLWNhcm91c2VsLXBhZ2luYXRpb24iKS5jc3MoInZpc2liaWxpdHkiLGN8fGE/ImhpZGRlbiI6InZpc2libGUiKX1mdW5jdGlvbiBoKGIsYyxhKXtrLmNhbGwodGhpcyxiLGMsYSk7aWYoMCE9PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPXRoaXM7ZS5nZXRBdHRyKCJjaXJjdWxhciIpPT09bCYmdGhpcy5zZXRBdHRyKCJjaXJjdWxhciIsITApO2UuZ2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIik9PT1sJiZ0aGlzLnNldEF0dHIoImhpZGVfb2ZmX3NjcmVlbiIsITApO2Uub25DaGFuZ2UoInRvdGFsUGFnZXMiLGZ1bmN0aW9uKGEpe2UuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtcGFnZS1tYXgiKS5odG1sKGEpO2E8ZS5nZXRBdHRyKCJwYWdlTnVtYmVyIikmJgplLmdvdG9QYWdlKGEpfSk7ZS5vbkNoYW5nZSgicGFnZU51bWJlciIsZnVuY3Rpb24oYSxjKXtjPWUuZG9tLiRjb250YWluZXI7dmFyIGI9Yy5maW5kKCIuYS1jYXJvdXNlbC1yZXN0YXJ0LWNvbnRhaW5lciIpOzE8YT9iLnNob3coKTpiLmhpZGUoKTtjLmZpbmQoIi5hLWNhcm91c2VsLXBhZ2UtY3VycmVudCIpLmh0bWwoYSl9KTtlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBrLnByb3RvdHlwZS5pbml0LmNhbGwoYSk/KGQodGhpcyksYS5vbkNoYW5nZSgicGFnZVNpemUgc2V0X3NpemUiLGZ1bmN0aW9uKCl7ZChhKX0pLDI+YS5nZXRBdHRyKCJwYWdlTnVtYmVyIikmJmEuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtcmVzdGFydC1jb250YWluZXIiKS5oaWRlKCksYS5nZXRBdHRyKGYuTk9fVFJBTlNJVElPTil8fGEuaW5pdFRvdWNoSGFuZGxpbmcoKSwhMCk6ITF9O3JldHVybiBlfX12YXIgbDtoLnByb3RvdHlwZT1uZXcgaztyZXR1cm4gaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Cmh9KTsidXNlIHN0cmljdCI7bi53aGVuKCJBIiwiYS1jYXJvdXNlbC1kZXNrdG9wIiwiYS1jYXJvdXNlbC1tb2JpbGUiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1jbGFzc2VzIixmdW5jdGlvbihlLGcsayl7cmV0dXJue2Rlc2t0b3A6Zyxtb2JpbGU6aywiZGVmYXVsdCI6ZS5jYXBhYmlsaXRpZXMubW9iaWxlfHxlLmNhcGFiaWxpdGllcy50YWJsZXQ/Im1vYmlsZSI6ImRlc2t0b3AifX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJwLWRldGVjdCIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtc3RyZXRjaHlnb29kbmVzcyIsZnVuY3Rpb24oZSxnLGssZil7ZnVuY3Rpb24gZChhLGMsYixkKXthLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IikmJihjLT1iLzEwKTt2YXIgZj1hLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIik7YS5nZXRBdHRyKCJzZXRfc2l6ZSIpO2E9MDtmb3IodmFyIGw9ITA7MDxjOylhKyssYz1kJiZsPwpjLWI6Yy0oYitmKSxsPSExOzA+YyYmYS0tO3JldHVybiBlLmlzRmluaXRlTnVtYmVyKGEpJiYwPGE/YToxfWZ1bmN0aW9uIGgoYSxjLGIsZCxmLGwsaCl7InN0cmV0Y2giPT09YS5nZXRBdHRyKCJzaW5nbGVfcGFnZV9hbGlnbiIpJiZkPmwmJihkPWwpO2MtPWIqZDthLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0Iik/KGE9Yy1mKihkKzEpLGgmJihhKz1mKSxoPWEvYixjLT1iKiguNTxoPy41OmgpKTpoJiYoYys9Zik7Yj1NYXRoLmNlaWwoYy8oZCsxKSk7aWYoIWUuaXNGaW5pdGVOdW1iZXIoYil8fGI8ZiliPWY7cmV0dXJuIGJ9ZnVuY3Rpb24gbChhKXtpZihhLmdldEF0dHIoImF1dG9fYWRqdXN0X2hlaWdodCIpKWlmKGEuZ2V0QXR0cigiYW5pbWF0aW5nIikpYS5vbmNlKCJhbmltYXRpbmciLGZ1bmN0aW9uKCl7bChhKX0pO2Vsc2V7dmFyIGM9YS5nZXRBdHRyKCJtYXhIZWlnaHQiKSxiPWEuZ2V0RGltZW5zaW9ucygpO2MmJmUuaXNGaW5pdGVOdW1iZXIoYyl8fChjPTEpO3ZhciBkPQpjLGY9YS5nZXRBdHRyKCJwYWdlU2l6ZSIpLGg9ZiooYS5nZXRBdHRyKCJwYWdlTnVtYmVyIiktMSksZj1oK2YtMSxiPWIuaXRlbXMsaz1iLmxlbmd0aCxnO2ZvcihhLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IikmJmYrKztoPD1mJiZoPGs7aCsrKShnPWJbaF0pJiZnLm91dGVySGVpZ2h0PmQmJihkPWJbaF0ub3V0ZXJIZWlnaHR8fGJbaF0uaGVpZ2h0KTtkPmMmJihhLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7dmlld3BvcnQ6e2hlaWdodDpkLG91dGVySGVpZ2h0OmR9fSksYS5zZXRBdHRyKCJtYXhIZWlnaHQiLGQpLDE9PT1jP2EuZG9tLiR2aWV3cG9ydC5oZWlnaHQoZCk6ZS5hbmltYXRlKGEuZG9tLiR2aWV3cG9ydCx7aGVpZ2h0OmR9LGEuZ2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIpLCJsaW5lYXIiKSl9ZWxzZSBhLmRvbS4kdmlld3BvcnQuY3NzKCJoZWlnaHQiLCIiKX1mdW5jdGlvbiBiKGEpe2Eub25DaGFuZ2UoInBhZ2VOdW1iZXIiLGZ1bmN0aW9uKCl7YS5nZXRBdHRyKCJoaWRlX29mZl9zY3JlZW4iKSYmCmEuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5jc3MoInZpc2liaWxpdHkiLCIiKX0pO2Eub25DaGFuZ2UoInBhZ2VTaXplIixmdW5jdGlvbihjLGIpe2M+YiYmbChhKX0pO2Eub25DaGFuZ2UoImxvYWRpbmciLGZ1bmN0aW9uKGMpe2N8fGwoYSl9KTthLm9uQ2hhbmdlKCJmaXJzdFZpc2libGVJdGVtIixmdW5jdGlvbigpe2woYSl9KTthLm9uQ2hhbmdlKCJhbmltYXRpbmciLGZ1bmN0aW9uKGMpe2lmKCFjJiZhLmdldEF0dHIoImhpZGVfb2ZmX3NjcmVlbiIpKXt2YXIgYj1hLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKS0xLGU9YithLmdldEF0dHIoInBhZ2VTaXplIiktMTthLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IikmJmUrKzthLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuZWFjaChmdW5jdGlvbihhLGMpe2E9YT49YiYmYTw9ZTtnKGMpLmNzcygidmlzaWJpbGl0eSIsYT8iIjoiaGlkZGVuIil9KX19KTthLm9uQ2hhbmdlKCJzaW5nbGVfcGFnZV9hbGlnbiBtaW5pbXVtX2d1dHRlcl93aWR0aCIsCmZ1bmN0aW9uKCl7YyhhKX0pO2Eub25DaGFuZ2UoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixmdW5jdGlvbigpe2MoYSl9KX1mdW5jdGlvbiBjKGEpe3ZhciBjPWEuZ2V0RGltZW5zaW9ucygpLGI9Yy52aWV3cG9ydC53aWR0aCxjPWMuZ2V0Rmlyc3RDYXJkV2lkdGgoKSxlPWEuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKSxmPWEuZ2V0QXR0cigic2V0X3NpemUiKSxsPWEuZ2V0QXR0cigiZmlyc3RfaXRlbV9mbHVzaF9sZWZ0Iiksaz1kKGEsYixjLGwpLGc9aChhLGIsYyxrLGUsZixsKTthLnNldEF0dHIoImN1cnJlbnRHdXR0ZXIiLGcpO2Euc2V0QXR0cigicGFnZVNpemUiLGspO3ZhciB0PWEuZG9tLiRjYXJvdXNlbCx4PXQuY2hpbGRyZW4oImxpIiksZT14Lmxlbmd0aCx3PWEuZ2V0QXR0cigidG90YWxQYWdlcyIpLHo9YS5nZXRBdHRyKCJwYWdlTnVtYmVyIikseT1hLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKSxuPSh6LTEpKmsrMTt6Pnc/KHk9KHctMSkqaysxLGEuc2V0QXR0cigicGFnZU51bWJlciIsCncpLGEuc2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIseSkpOnkhPT1uJiYodz1NYXRoLmNlaWwoeS9rKSx5PSh3LTEpKmsrMSxhLnNldEF0dHIoInBhZ2VOdW1iZXIiLHcpLGEuc2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIseSkpO3ZhciBGPXktMSxCPUYray0xO2EuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSYmQisrO3ZhciBIPWEuZ2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIiksST1nKyJweCIsSj1jKyJweCIsRzt4LmVhY2goZnVuY3Rpb24oYSxjKXtHPSFIfHxhPj1GJiZhPD1CO2Muc3R5bGUubWFyZ2luTGVmdD1sJiYwPT09YT8wOkk7Yy5zdHlsZS52aXNpYmlsaXR5PUc/IiI6ImhpZGRlbiI7Yy5zdHlsZS53aWR0aD1KfSk7dmFyIEQ7YS5nZXRBdHRyKCJmaXJzdF9pdGVtX2ZsdXNoX2xlZnQiKT8oZz14LmZpcnN0KCkub3V0ZXJXaWR0aCghMCksMTx4Lmxlbmd0aCYmKEQ9eC5lcSgxKS5vdXRlcldpZHRoKCEwKSksdz0oZS0xKSpEK2cpOihnPUQ9eC5maXJzdCgpLm91dGVyV2lkdGgoITApLAp3PWUqRCk7az49Zj8odz1iLHo9YS5nZXRBdHRyKCJzaW5nbGVfcGFnZV9hbGlnbiIpLHQudG9nZ2xlQ2xhc3MoImEtdGV4dC1yaWdodCIsInJpZ2h0Ij09PXopLHQudG9nZ2xlQ2xhc3MoImEtdGV4dC1jZW50ZXIiLCJjZW50ZXIiPT09eiksImNlbnRlciI9PT16JiZ4LmZpcnN0KCkuY3NzKCJtYXJnaW4tbGVmdCIsMCkpOnQucmVtb3ZlQ2xhc3MoImEtdGV4dC1yaWdodCBhLXRleHQtY2VudGVyIik7dz1rPj1mP2I6dzt0LmNzcygid2lkdGgiLHcrInB4Iik7Yj17Y2Fyb3VzZWw6e3dpZHRoOncsb3V0ZXJXaWR0aDp0Lm91dGVyV2lkdGgoKX0saXRlbXM6W119O2ZvcihmPTA7ZjxlO2YrKyliLml0ZW1zLnB1c2goe3dpZHRoOmMsb3V0ZXJXaWR0aDowPT09Zj9nOkR9KTthLnVwZGF0ZURpbWVuc2lvbnNDYWNoZShiKTthLmdvdG9JbmRleCh5LHthbmltYXRpb25EdXJhdGlvbjowLGlnbm9yZVBhdXNlOiEwfSk7YS50cmlnZ2VyRXZlbnQoInJlcGFpbnQiKX1yZXR1cm57cmVwYWludDpjLGluaXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9CmEuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKTtlLmlzRmluaXRlTnVtYmVyKGQpfHwoZD0xNSxhLnNldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixkKSk7YS5zZXRBdHRyKCJjdXJyZW50R3V0dGVyIixkKTtkPWEuZ2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIpO2UuaXNGaW5pdGVOdW1iZXIoZCl8fGEuc2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIsMjAwKTthLnNldEF0dHIoImZpcnN0X2l0ZW1fZmx1c2hfbGVmdCIsISFhLmdldEF0dHIoImZpcnN0X2l0ZW1fZmx1c2hfbGVmdCIpKTthLnNldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiwhIWEuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSk7YyhhKTthLmdldEF0dHIoZi5OT19UUkFOU0lUSU9OKXx8bChhKTtkPWEuZ2V0RGltZW5zaW9ucygpO2EuZG9tLiRjb250YWluZXIuZmluZCgiLmEtY2Fyb3VzZWwtbGVmdCwgLmEtY2Fyb3VzZWwtcmlnaHQsIC5hLWNhcm91c2VsLXZpZXdwb3J0IikuY3NzKCJoZWlnaHQiLApNYXRoLm1heChkLnZpZXdwb3J0LmhlaWdodCxkLml0ZW1zWzBdP2QuaXRlbXNbMF0uaGVpZ2h0OjApKyJweCIpO2Q9YS5nZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIik7MTxkJiYoYS5zZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIixkKSxkPU1hdGguY2VpbChkL2EuZ2V0QXR0cigicGFnZVNpemUiKSksYS5nb3RvUGFnZShkKSk7YihhKX0scmVzaXplOmZ1bmN0aW9uKGEsYil7Yi52aWV3cG9ydCYmdm9pZCAwIT09Yi52aWV3cG9ydC53aWR0aCYmYyhhKX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsInAtZGV0ZWN0IiwiYS1jYXJvdXNlbC11dGlscyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWRpc3BsYXktc3dhcCIsZnVuY3Rpb24oZSxnLGssZil7ZnVuY3Rpb24gZChjKXtpZihjLmdldEF0dHIoImF1dG9fYWRqdXN0X2hlaWdodCIpKXt2YXIgYT1jLmdldEF0dHIoIm1heEhlaWdodCIpO2EmJmUuaXNGaW5pdGVOdW1iZXIoYSl8fChhPTEpO3ZhciBiPWE7Yy5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLm5vdCgiLmEtY2Fyb3VzZWwtY2FyZC1lbXB0eSIpLmVhY2goZnVuY3Rpb24oYSwKYyl7YT1nKGMpLm91dGVySGVpZ2h0KCk7Yj1NYXRoLm1heChhLGIpfSk7Yj5hJiYoYy5zZXRBdHRyKCJtYXhIZWlnaHQiLGIpLGsuY2FwYWJpbGl0aWVzLnRyYW5zaXRpb24/MT09PWE/Yy5kb20uJHZpZXdwb3J0LmhlaWdodChiKTplLmFuaW1hdGUoYy5kb20uJHZpZXdwb3J0LHtoZWlnaHQ6Yn0sYy5nZXRBdHRyKCJoZWlnaHRfYW5pbWF0aW9uX3NwZWVkIiksImxpbmVhciIpOmMuZG9tLiR2aWV3cG9ydC5oZWlnaHQoYiksYy51cGRhdGVEaW1lbnNpb25zQ2FjaGUoe3ZpZXdwb3J0OntoZWlnaHQ6YixvdXRlckhlaWdodDpifX0pKX1lbHNlIGMuZG9tLiR2aWV3cG9ydC5jc3MoImhlaWdodCIsIiIpfWZ1bmN0aW9uIGgoYyxhKXt2YXIgYj1jLmRvbS4kY2Fyb3VzZWxbMF07Yz1jLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuZ2V0KCk7Zm9yKHZhciBkO2MubGVuZ3RoPmE7KWQ9Yy5wb3AoKSxiLnJlbW92ZUNoaWxkKGQpfWZ1bmN0aW9uIGwoYyl7Yy5vbkNoYW5nZSgiYW5pbWF0aW5nIiwKZnVuY3Rpb24oYSl7YXx8ZChjKX0pO2Mub25DaGFuZ2UoImxvYWRpbmciLGZ1bmN0aW9uKGEpe2F8fGQoYyl9KTtjLm9uQ2hhbmdlKCJwYWdlU2l6ZSIsZnVuY3Rpb24oYSxiKXtpZihhPmIpezA9PT1iJiZoKGMpO2I9Yy5nZXRBdHRyKCJzZXRfc2l6ZSIpO3ZhciBlPWMuZ2V0RGltZW5zaW9ucygpLmdldEZpcnN0Q2FyZFdpZHRoKCksbD1jLmdldEF0dHIoImN1cnJlbnRHdXR0ZXIiKSxtPWMuZ2V0QXR0cigiZmV0Y2hlZEl0ZW1zIiksaz1jLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKS0xLHY9Yy5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLHI9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHQ7aWYoZy5pc0FycmF5KG0pKXtmb3IodmFyIHg9di5sZW5ndGg7eDxhO3grKyl0PXgrayx2PWcoWydceDNjbGkgY2xhc3NceDNkImEtY2Fyb3VzZWwtY2FyZCBhLWNhcm91c2VsLWNhcmQtZW1wdHkiIHJvbGVceDNkImxpc3RpdGVtIiBhcmlhLXNldHNpemVceDNkIicsCmIsJyIgYXJpYS1wb3NpbnNldFx4M2QiJyx0KzEsJyIgc3R5bGVceDNkIndpZHRoOicsZSwicHg7IG1hcmdpbi1sZWZ0OiIsbCwncHg7Ilx4M2UnLGMuZ2V0U3RhdGljTG9hZGVyKCldLmpvaW4oIiIpKSxtW3RdJiZmLmFkZEVsZW1lbnRUb0RvbSh2LGYuZ2V0RWxlbWVudEZyb21JdGVtKG1bdF0pKSx0Pj1iJiZ2LnJlbW92ZUNsYXNzKCJhLWNhcm91c2VsLWNhcmQtZW1wdHkiKSxyLmFwcGVuZENoaWxkKHZbMF0pO2MuZG9tLiRjYXJvdXNlbC5hcHBlbmQocil9ZChjKX1lbHNlIGE8YiYmaChjKX0pO2Mub25DaGFuZ2UoInNldF9zaXplIixmdW5jdGlvbihhLGQpe3ZhciBmPWMuZ2V0QXR0cigicGFnZU51bWJlciIpLGw9Yy5nZXRBdHRyKCJ0b3RhbFBhZ2VzIiksaD1jLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIik7Zj09PWwmJmE+ZCYmKGgubGVuZ3RoJiZjLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuZWFjaChmdW5jdGlvbihhLGIpe2UudHJpbShiLmlubmVySFRNTCl8fAooYi5jbGFzc05hbWUrPSIgYS1jYXJvdXNlbC1jYXJkLWVtcHR5IixiLmlubmVySFRNTD1jLmdldFN0YXRpY0xvYWRlcigpKX0pLDA9PT1kJiZiKGMpKX0pO2Mub25DaGFuZ2UoInNpbmdsZV9wYWdlX2FsaWduIG1pbmltdW1fZ3V0dGVyX3dpZHRoIixmdW5jdGlvbigpe2IoYyl9KTtjLm9uQ2hhbmdlKCJtaW5pbXVtX2d1dHRlcl93aWR0aCIsZnVuY3Rpb24oKXtiKGMpfSl9ZnVuY3Rpb24gYihjKXt2YXIgYT1jLmdldERpbWVuc2lvbnMoKSxiPWEudmlld3BvcnQud2lkdGgsZD1hLmdldEZpcnN0Q2FyZFdpZHRoKCksZj1jLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIiksYT1jLmdldEF0dHIoInNldF9zaXplIiksbDtsPWMuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKTtjLmdldEF0dHIoInNldF9zaXplIik7bD1NYXRoLm1heChNYXRoLmZsb29yKGIvKGQrbCkpLDEpO2w9ZS5pc0Zpbml0ZU51bWJlcihsKT9sOjE7dmFyIGssZz1sOyJzdHJldGNoIj09PWMuZ2V0QXR0cigic2luZ2xlX3BhZ2VfYWxpZ24iKSYmCmc+YSYmKGc9YSk7Zz1NYXRoLmNlaWwoKGItZCpnKS8oZysxKSk7ZS5pc0Zpbml0ZU51bWJlcihnKXx8KGc9Zik7az1nO2Muc2V0QXR0cigiY3VycmVudEd1dHRlciIsayk7Yy5zZXRBdHRyKCJwYWdlU2l6ZSIsbCk7dmFyIGc9Yy5kb20uJGNhcm91c2VsLHI9Zy5jaGlsZHJlbigibGkiKSxmPXIubGVuZ3RoLGQ9ZCtrLHQ9ZipkO2goYyxNYXRoLm1pbihsLGEpKTtyLmNzcygibWFyZ2luLWxlZnQiLGsrInB4Iik7bD49YT8odD1iLGI9Yy5nZXRBdHRyKCJzaW5nbGVfcGFnZV9hbGlnbiIpLGcudG9nZ2xlQ2xhc3MoImEtdGV4dC1yaWdodCIsInJpZ2h0Ij09PWIpLGcudG9nZ2xlQ2xhc3MoImEtdGV4dC1jZW50ZXIiLCJjZW50ZXIiPT09YiksImNlbnRlciI9PT1iJiZyLmZpcnN0KCkuY3NzKCJtYXJnaW4tbGVmdCIsMCkpOmcucmVtb3ZlQ2xhc3MoImEtdGV4dC1yaWdodCBhLXRleHQtY2VudGVyIik7Zm9yKGI9e2Nhcm91c2VsOnt3aWR0aDp0LG91dGVyV2lkdGg6Zy5vdXRlcldpZHRoKCl9LAppdGVtczpbXX07Zi0tOyliLml0ZW1zLnB1c2goe291dGVyV2lkdGg6ZH0pO2MudXBkYXRlRGltZW5zaW9uc0NhY2hlKGIpO2MudHJpZ2dlckV2ZW50KCJyZXBhaW50Iil9cmV0dXJue3JlcGFpbnQ6Yixpbml0OmZ1bmN0aW9uKGMpe3ZhciBhPWMuZ2V0QXR0cigibWluaW11bV9ndXR0ZXJfd2lkdGgiKTthfHwoYT0xNSxjLnNldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixhKSk7Yy5zZXRBdHRyKCJjdXJyZW50R3V0dGVyIixhKTthPWMuZ2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIpO2UuaXNGaW5pdGVOdW1iZXIoYSl8fGMuc2V0QXR0cigiaGVpZ2h0X2FuaW1hdGlvbl9zcGVlZCIsMjAwKTtsKGMpO2IoYyk7YT1jLmdldERpbWVuc2lvbnMoKTtjLmRvbS4kY29udGFpbmVyLmZpbmQoIi5hLWNhcm91c2VsLWxlZnQsIC5hLWNhcm91c2VsLXJpZ2h0LCAuYS1jYXJvdXNlbC12aWV3cG9ydCIpLmNzcygiaGVpZ2h0IixNYXRoLm1heChhLnZpZXdwb3J0LmhlaWdodCxhLml0ZW1zWzBdPwphLml0ZW1zWzBdLmhlaWdodDowKSsicHgiKTthPWMuZ2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIpOzE8YSYmKGMuc2V0QXR0cigiZmlyc3RWaXNpYmxlSXRlbSIsYSksYT1NYXRoLmNlaWwoYS9jLmdldEF0dHIoInBhZ2VTaXplIikpLGMuZ290b1BhZ2UoYSkpfSxyZXNpemU6ZnVuY3Rpb24oYyxhKXthLnZpZXdwb3J0JiZ2b2lkIDAhPT1hLnZpZXdwb3J0LndpZHRoJiZiKGMpfX19KTsidXNlIHN0cmljdCI7bi53aGVuKCJBIiwialF1ZXJ5IikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtZGlzcGxheS1zaW5nbGUiLGZ1bmN0aW9uKGUsZyl7ZnVuY3Rpb24gayhkKXtpZihkLmdldEF0dHIoImF1dG9fYWRqdXN0X2hlaWdodCIpKWlmKGQuZ2V0QXR0cigiYW5pbWF0aW5nIikpZC5vbmNlKCJhbmltYXRpbmciLGZ1bmN0aW9uKCl7ayhkKX0pO2Vsc2UgZC5kb20uJHZpZXdwb3J0LmNzcygiaGVpZ2h0IiwiYXV0byIpLGUuZGVsYXkoZnVuY3Rpb24oKXtkLmRvbS4kdmlld3BvcnQuaGVpZ2h0KGQuZG9tLiR2aWV3cG9ydC5oZWlnaHQoKSl9LAowKTtlbHNlIGQuZG9tLiR2aWV3cG9ydC5jc3MoImhlaWdodCIsIiIpfWZ1bmN0aW9uIGYoZCxiKXt2YXIgYz1kLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksYT1kLmdldEF0dHIoImZpcnN0VmlzaWJsZUl0ZW0iKS0xO2Q9ZC5nZXRBdHRyKCJzaG93X3BhcnRpYWxfbmV4dCIpPzI6MTthPWMuc2xpY2UoYSxhK2QpO2Mubm90KGEpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpO2ImJmEuY3NzKCJ2aXNpYmlsaXR5IiwiIil9ZnVuY3Rpb24gZChkKXtkLmdldEF0dHIoImZpeGVkX2hlaWdodCIpfHwoZC5kb20uJHZpZXdwb3J0LmRlbGVnYXRlKCJpbWciLCJsb2FkIixmdW5jdGlvbigpe2soZCl9KSxkLm9uQ2hhbmdlKCJsb2FkaW5nIixmdW5jdGlvbihiKXtifHxrKGQpfSksZC5vbkNoYW5nZSgicGFnZU51bWJlciIsZnVuY3Rpb24oKXtkLmdldEF0dHIoImhpZGVfb2ZmX3NjcmVlbiIpJiZkLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuY3NzKCJ2aXNpYmlsaXR5IiwiIil9KSwKZC5vbkNoYW5nZSgiYW5pbWF0aW5nIixmdW5jdGlvbihiKXshYiYmZC5nZXRBdHRyKCJoaWRlX29mZl9zY3JlZW4iKSYmZihkKX0pLGQub25DaGFuZ2UoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIixmdW5jdGlvbigpe2goZCl9KSl9ZnVuY3Rpb24gaChkKXt2YXIgYj1kLmdldERpbWVuc2lvbnMoKSxjPWIudmlld3BvcnQud2lkdGgsYT1kLmdldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiksZT1kLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIiksaD1kLmdldEF0dHIoInNldF9zaXplIikscD1kLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksYz1jLTIqZTthJiYoYy09ZStiLnZpZXdwb3J0LndpZHRoLzMpO3AuY3NzKHt3aWR0aDpjKyJweCIsbWFyZ2luOiIwICIrZSsicHgifSk7Yj1jKzIqZTthPWIqaDtkLmRvbS4kY2Fyb3VzZWwud2lkdGgoYSk7Zm9yKGE9e2Nhcm91c2VsOnt3aWR0aDphfSxpdGVtczpbXX07aC0tOylhLml0ZW1zW2hdPXt3aWR0aDpjLG91dGVyV2lkdGg6Yn07CmQudXBkYXRlRGltZW5zaW9uc0NhY2hlKGEpO2QuZ2V0QXR0cigiaGlkZV9vZmZfc2NyZWVuIikmJmYoZCwhMCk7ZC5nb3RvSW5kZXgoZC5nZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIikse2FuaW1hdGlvbkR1cmF0aW9uOjAsaWdub3JlUGF1c2U6ITB9KTtkLnRyaWdnZXJFdmVudCgicmVwYWludCIpfXJldHVybntyZXBhaW50OmgsaW5pdDpmdW5jdGlvbihmKXt2YXIgYj1mLmdldEF0dHIoIm1pbmltdW1fZ3V0dGVyX3dpZHRoIik7Zi5zZXRBdHRyKCJtaW5pbXVtX2d1dHRlcl93aWR0aCIsZS5pc0Zpbml0ZU51bWJlcihiKT9iOjE0KTtmLnNldEF0dHIoInNob3dfcGFydGlhbF9uZXh0IiwhIWYuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSk7Zi5zZXRBdHRyKCJwYWdlU2l6ZSIsMSk7Zi5zZXRBdHRyKCJwYWdlU2l6ZSIsMSk7Yj1mLmdldEF0dHIoImZpeGVkX2hlaWdodCIpO2UuaXNGaW5pdGVOdW1iZXIoYik/Zi5kb20uJHZpZXdwb3J0LmhlaWdodChiKTpmLnNldEF0dHIoImZpeGVkX2hlaWdodCIsCiExKTtmLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpO2QoZik7dGhpcy5yZXBhaW50KGYpO2soZil9LHJlc2l6ZTpmdW5jdGlvbihkLGIpe2Iudmlld3BvcnQmJnZvaWQgMCE9PWIudmlld3BvcnQud2lkdGgmJih0aGlzLnJlcGFpbnQoZCksZC5nZXRBdHRyKCJmaXhlZF9oZWlnaHQiKXx8ayhkKSl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWRpc3BsYXktcGVla2NpcmN1bGFyIixmdW5jdGlvbihlLGcsayl7ZnVuY3Rpb24gZihkKXtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIGUuaXNGaW5pdGVOdW1iZXIoZik/ZjpkfX1nPXt9O2dbay5QQUdFX1NJWkVdPTE7Z1trLk1JTl9HVVRURVJdPWYoMTQpO2dbay5QRUVLX1BFUkNFTlRBR0VdPWYoMTApO3JldHVybntpbml0QXR0cnM6Zyxpbml0OmZ1bmN0aW9uKGQpe3ZhciBlPXRoaXM7CmQub25DaGFuZ2Uoay5QRUVLX1BFUkNFTlRBR0UsZnVuY3Rpb24oZixiKXtlLnJlcGFpbnQoZCl9KTtkLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpO2UucmVwYWludChkKX0scmVwYWludDpmdW5jdGlvbihkKXt2YXIgZj1kLmdldEF0dHIoay5NSU5fR1VUVEVSKSxnPWQuZ2V0QXR0cihrLlNFVF9TSVpFKSxiPWQuZ2V0QXR0cihrLlBFRUtfUEVSQ0VOVEFHRSksYz1kLmdldERpbWVuc2lvbnMoKS52aWV3cG9ydC53aWR0aCxhPWQuZG9tLiRjYXJvdXNlbCxxPWEuY2hpbGRyZW4oImxpIiksYj1iLzEwMCpjLHU9Yy0yKmItZixwPXUrMipmLGM9cCpnO2Eud2lkdGgoYyk7cS5jc3Moe3dpZHRoOnUrInB4IiwibWFyZ2luLWxlZnQiOmYrInB4IiwibWFyZ2luLXJpZ2h0IjpmKyJweCJ9KTtkLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7Y2Fyb3VzZWw6e3dpZHRoOmN9LGl0ZW1zOmUubWFwKGUucmFuZ2UoZyksZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dSwKb3V0ZXJXaWR0aDpwfX0pfSk7ZC5zZXRBdHRyKGsuUEVFS19XSURUSCxiLCExKTtkLnRyaWdnZXJFdmVudCgicmVwYWludCIpfSxyZXNpemU6ZnVuY3Rpb24oZCxlKXtlLnZpZXdwb3J0JiZ2b2lkIDAhPT1lLnZpZXdwb3J0LndpZHRoJiZ0aGlzLnJlcGFpbnQoZCl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1kaXNwbGF5LXZhcmlhYmxld2lkdGgiLGZ1bmN0aW9uKGUpe3JldHVybntpbml0OmUuY29uc3RhbnRzLk5PT1AscmVzaXplOmUuY29uc3RhbnRzLk5PT1AscmVwYWludDplLmNvbnN0YW50cy5OT09QfX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oImEtY2Fyb3VzZWwtc3RyZXRjaHlnb29kbmVzcyIsImEtY2Fyb3VzZWwtZGlzcGxheS1zd2FwIiwiYS1jYXJvdXNlbC1kaXNwbGF5LXNpbmdsZSIsImEtY2Fyb3VzZWwtZGlzcGxheS1wZWVrY2lyY3VsYXIiLCJhLWNhcm91c2VsLWRpc3BsYXktdmFyaWFibGV3aWR0aCIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtZGlzcGxheSIsCmZ1bmN0aW9uKGUsZyxrLGYsZCl7cmV0dXJue3N3YXA6ZyxzaW5nbGU6ayxwZWVrQ2lyY3VsYXI6ZixzdHJldGNoeUdvb2RuZXNzOmUsdmFyaWFibGVXaWR0aDpkLCJkZWZhdWx0Ijoic3RyZXRjaHlHb29kbmVzcyJ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsImEtY2Fyb3VzZWwtdXRpbHMiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXN3YXAiLGZ1bmN0aW9uKGUsZyxrKXtmdW5jdGlvbiBmKGIsYyl7dmFyIGE9Yi5nZXRBdHRyKCJwcmVsb2FkZWRJbWFnZXMiKTthfHwoYT1bXSk7Zm9yKHZhciBkPVtdLGY9Yy5sZW5ndGgtMTswPD1mO2YtLSlpZihjW2ZdJiYhYVtmXSl7dmFyIGg9ay5nZXRFbGVtZW50RnJvbUl0ZW0oY1tmXSk7aCYmZygiaW1nIixoKS5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKHRoaXMuc3JjKX0pO2FbZl09ITB9ZS5wcmVsb2FkKGQpO2Iuc2V0QXR0cigicHJlbG9hZGVkSW1hZ2VzIixhKX1mdW5jdGlvbiBkKGIpe3JldHVybiJudW1iZXIiPT09CnR5cGVvZiBiP2I/MD5iPy0xOjE6aXNOYU4oYik/TmFOOjA6TmFOfWZ1bmN0aW9uIGgoYixjKXtiLmdldEF0dHIoInBhZ2VOdW1iZXIiKTtiLmdldEF0dHIoInBhZ2VTaXplIik7dmFyIGE9Yi5nZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIiksZD1iLmdldEF0dHIoImRlbGF5X3RpbWUiKSxmPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKSxoPWYuZmlsdGVyKCIuYS1jYXJvdXNlbC1jYXJkLWVtcHR5Iik7aC5sZW5ndGgmJmIuc2V0QXR0cigibG9hZGluZyIsITApO2guZWFjaChmdW5jdGlvbihtLGwpe3ZhciB2PWcobCk7bD1mLmluZGV4KGwpK2EtMTt2YXIgcj1jW2xdO3ImJmUuZGVsYXkoZnVuY3Rpb24oKXtrLmFkZEVsZW1lbnRUb0RvbSh2LGsuZ2V0RWxlbWVudEZyb21JdGVtKHIpKTttPT09aC5sZW5ndGgtMSYmYi5zZXRBdHRyKCJsb2FkaW5nIiwhMSl9LDArZCl9KX1mdW5jdGlvbiBsKGIsYyxhKXthPWF8fHt9O3ZhciBmPWIuZ2V0QXR0cigicGFnZU51bWJlciIpO2lmKGMhPT0KZil7dmFyIGg9Yi5nZXRBdHRyKCJzZXRfc2l6ZSIpLHA9Yi5nZXRBdHRyKCJ0b3RhbFBhZ2VzIiksbT1iLmdldEF0dHIoImNpcmN1bGFyIiksZz1iLmdldEF0dHIoInBhZ2VTaXplIiksbD1hLmRlbGF5VGltZXx8Yi5nZXRBdHRyKCJkZWxheV90aW1lIikscj1kKGEuZGlyZWN0aW9uKXx8TmFOOyFtJiYxPmM/Yz0xOiFtJiZjPnA/Yz1wOm0mJjE+Yz9jPXA6bSYmYz5wJiYoYz0xKTtyfHwocj1mPGM/MTotMSk7YS5zdGFydG92ZXImJihyPWw9MSk7dmFyIHQ9ZyooYy0xKSx4PTE9PT1yPzA6Zy0xO2Iuc2V0QXR0cigicGFnZU51bWJlciIsYyk7Yi5zZXRBdHRyKCJmaXJzdFZpc2libGVJdGVtIix0KzEpO2Iuc2V0QXR0cigiYW5pbWF0aW5nIiwhMCk7dmFyIHc9ZS5pbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXQreDtpZih3IT09Yi5nZXRBdHRyKCJyZXNwb25zaXZlVGltZXJJZCIpKWNsZWFySW50ZXJ2YWwodyk7ZWxzZSBpZigtMT09PXImJjA+eHx8MT09PXImJng+PWcpYi5zZXRBdHRyKCJyZXNwb25zaXZlVGltZXJJZCIsCnZvaWQgMCksYi5zZXRBdHRyKCJhbmltYXRpbmciLCExKTtlbHNle3ZhciBjPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5lcSh4KSxkPWIuZ2V0QXR0cigiZmV0Y2hlZEl0ZW1zIilbYV07ZD9rLmFkZEVsZW1lbnRUb0RvbShjLGsuZ2V0RWxlbWVudEZyb21JdGVtKGQpKTphPGg/Yy5odG1sKGIuZ2V0U3RhdGljTG9hZGVyKCkpLmFkZENsYXNzKCJhLWNhcm91c2VsLWNhcmQtZW1wdHkiKTpjLmVtcHR5KCkucmVtb3ZlQ2xhc3MoImEtY2Fyb3VzZWwtY2FyZC1lbXB0eSIpO3grPXJ9fSxsKTtiLnNldEF0dHIoInJlc3BvbnNpdmVUaW1lcklkIix3KX19cmV0dXJue2luaXQ6ZnVuY3Rpb24oYil7dmFyIGM9Yi5nZXRBdHRyKCJkZWxheV90aW1lIik7ZS5pc0Zpbml0ZU51bWJlcihjKXx8Yi5zZXRBdHRyKCJkZWxheV90aW1lIiwzMCk7Yi5vbkNoYW5nZSgicmVzcG9uc2l2ZVRpbWVySWQiLGZ1bmN0aW9uKGEsYyl7YyE9PWEmJmNsZWFySW50ZXJ2YWwoYyl9KTtiLm9uQ2hhbmdlKCJmZXRjaGVkSXRlbXMiLApmdW5jdGlvbihhLGMpe2goYixhKTtmKGIsYSl9KTtmKGIsYi5nZXRBdHRyKCJmZXRjaGVkSXRlbXMiKSl9LGdvdG9JbmRleDpmdW5jdGlvbihiLGMsYSl7YT1hfHx7fTt2YXIgZD1iLmdldEF0dHIoInBhZ2VTaXplIik7bChiLE1hdGguY2VpbChjL2QpLGEpfSxnb3RvTmV4dFBhZ2U6ZnVuY3Rpb24oYixjKXtjPWN8fHt9O3ZhciBhPWIuZ2V0QXR0cigicGFnZU51bWJlciIpO2MuZGlyZWN0aW9uPS0xO2woYiwrK2EsYyl9LGdvdG9QcmV2UGFnZTpmdW5jdGlvbihiLGMpe2M9Y3x8e307dmFyIGE9Yi5nZXRBdHRyKCJwYWdlTnVtYmVyIik7Yy5kaXJlY3Rpb249MTtsKGIsLS1hLGMpfSxnb3RvUGFnZTpsfX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJqUXVlcnkiLCJhLWNhcm91c2VsLXV0aWxzIiwiYS1jYXJvdXNlbC1jb25zdGFudHMiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXNsaWRlIixmdW5jdGlvbihlLGcsayxmKXtmdW5jdGlvbiBkKGIpe3ZhciBjPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5sZW5ndGgsCmE9YysxLGQ9Yi5nZXRBdHRyKGYuU0VUX1NJWkUpLGU9ZC1jO2lmKDA8ZSl7Zm9yKHZhciBlPWErZS0xLGg9W107YTw9ZTthKyspaC5wdXNoKGIuZ2V0RW1wdHlDYXJkKGEsZCkpO2IuZG9tLiRjYXJvdXNlbC5hcHBlbmQoaC5qb2luKCIiKSk7Yi5zZXRBdHRyKGYuTE9BRElORywhMCk7Zm9yKHZhciBlPWIuZ2V0QXR0cihmLkZFVENIRURfSVRFTVMpLGg9Yi5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLGcsYT1jO2E8ZDthKyspaWYoZz1lW2FdKXt2YXIgbD1rLmdldEVsZW1lbnRGcm9tSXRlbShnKSxjPWguZXEoYSk7ay5hZGRFbGVtZW50VG9Eb20oYyxsKTtlW2FdPWsuY2xlYXJFbGVtZW50RnJvbUl0ZW0oZyl9Yi5zdHJhdGVnaWVzLmRpc3BsYXkucmVwYWludCYmYi5zdHJhdGVnaWVzLmRpc3BsYXkucmVwYWludChiKTtiLnNldEF0dHIoZi5GRVRDSEVEX0lURU1TLGUsITApO2Iuc2V0QXR0cihmLkxPQURJTkcsITEpfX1mdW5jdGlvbiBoKGIsYyxhKXtpZihiLmdldEF0dHIoZi5BTklNQVRJTkcpKWIub25jZShmLkFOSU1BVElORywKZnVuY3Rpb24oKXtoKGIsYyxhKX0pO2Vsc2V7dmFyIGQ9Yi5nZXREaW1lbnNpb25zKCkuaXRlbXM7aWYoIWF8fGMubGVuZ3RoPj1hLmxlbmd0aCl7Yi5zZXRBdHRyKGYuTE9BRElORywhMCk7Zm9yKHZhciBnPWIuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKSxwPWMubGVuZ3RoLG0sbDtwLS07KWlmKChsPWNbcF0pJiYhZS5lcXVhbHMobCxhW3BdKSYmITAhPT1sJiYhMCE9PWwuY29udGVudCl7dmFyIHY9ay5nZXRFbGVtZW50RnJvbUl0ZW0obCk7bT1nLmVxKHApO20ubGVuZ3RoJiYoay5hZGRFbGVtZW50VG9Eb20obSx2KSxkW3BdPXt3aWR0aDptLm91dGVyV2lkdGgoKSxvdXRlcldpZHRoOm0ub3V0ZXJXaWR0aCghMCksaGVpZ2h0Om0ub3V0ZXJIZWlnaHQoKSxvdXRlckhlaWdodDptLm91dGVySGVpZ2h0KCEwKX0sY1twXT1rLmNsZWFyRWxlbWVudEZyb21JdGVtKGwpKX19Yi5zZXRBdHRyKGYuRkVUQ0hFRF9JVEVNUyxjKTtiLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7aXRlbXM6ZH0pOwpiLnNldEF0dHIoZi5MT0FESU5HLCExKX19dmFyIGw9ZS5jYXBhYmlsaXRpZXMudG91Y2g/MkUzOjNFMztyZXR1cm57d3JhcFRvRmlyc3Q6ZnVuY3Rpb24oYil7dmFyIGM9Yi5nZXRBdHRyKGYuUEFHRV9TSVpFKSxhPWIuZ2V0RGltZW5zaW9ucygpLmdldEZpcnN0Q2FyZFdpZHRoKCksZD10aGlzO2IuZ290b1BpeGVsKGMqYSotMSx7YW5pbWF0aW9uRHVyYXRpb246MCxjYWxsYmFjazpmdW5jdGlvbigpe2Iuc2V0QXR0cihmLkNVUlJFTlRMWV9XUkFQUElORywhMSk7ZC5nb3RvUGFnZShiLDEpfX0pfSx3cmFwVG9MYXN0OmZ1bmN0aW9uKGIpe2IuZ2V0QXR0cihmLlBBR0VfU0laRSk7dmFyIGM9Yi5nZXRBdHRyKGYuVE9UQUxfUEFHRVMpLGE9dGhpcyxkPWIuZ2V0RGltZW5zaW9ucygpLmNhcm91c2VsLndpZHRoO2IuZ290b1BpeGVsKGQse2FuaW1hdGlvbkR1cmF0aW9uOjAsY2FsbGJhY2s6ZnVuY3Rpb24oKXtiLnNldEF0dHIoZi5DVVJSRU5UTFlfV1JBUFBJTkcsITEpO2EuZ290b1BhZ2UoYiwKYyl9fSl9LGdvdG9QYWdlOmZ1bmN0aW9uKGIsYyxhKXthPWF8fHt9Oyh2b2lkIDA9PT1hLmFuaW1hdGlvbkR1cmF0aW9ufHwwPGEuYW5pbWF0aW9uRHVyYXRpb24pJiYhYS5zaWxlbnQmJmIuc2V0QXR0cihmLkFOSU1BVElORywhMCk7dmFyIGQ9Yi5nZXRBdHRyKGYuVE9UQUxfUEFHRVMpOzA8YyYmYzw9ZCYmYi5zZXRBdHRyKGYuUEFHRV9OVU1CRVIsYyk7dmFyIGU9Yi5nZXRBdHRyKGYuQ0lSQ1VMQVIpOyFlJiYxPmM/KGM9MSxhLmFuaW1hdGlvbkR1cmF0aW9uPU1hdGgucG93KGIuZ2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCkqYi5nZXRBdHRyKGYuU1BSSU5HSU5FU1MpKSk6IWUmJmM+ZCYmKGM9ZCxhLmFuaW1hdGlvbkR1cmF0aW9uPU1hdGgucG93KGIuZ2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCksYi5nZXRBdHRyKGYuU1BSSU5HSU5FU1MpKSk7dGhpcy5nb3RvSW5kZXgoYixiLmdldEF0dHIoZi5QQUdFX1NJWkUpKihjLTEpKzEsYSl9LGdvdG9JbmRleDpmdW5jdGlvbihiLGMsCmEpe2E9YXx8e307KHZvaWQgMD09PWEuYW5pbWF0aW9uRHVyYXRpb258fDA8YS5hbmltYXRpb25EdXJhdGlvbikmJiFhLnNpbGVudCYmYi5zZXRBdHRyKGYuQU5JTUFUSU5HLCEwKTt2YXIgZD1iLmdldEF0dHIoZi5DSVJDVUxBUikmJiFiLmdldEF0dHIoZi5DVVJSRU5UTFlfV1JBUFBJTkcpLGg9YS5jYWxsYmFjayxnPXRoaXMsbD0hMSxrPWIuZ2V0Vmlld3BvcnRXaWR0aCgpLHY9TWF0aC5jZWlsKGMvYi5nZXRBdHRyKGYuUEFHRV9TSVpFKSkscjt2IT09Yi5nZXRBdHRyKGYuUEFHRV9OVU1CRVIpJiYwPHYmJnY8PWIuZ2V0QXR0cihmLlRPVEFMX1BBR0VTKSYmYi5zZXRBdHRyKGYuUEFHRV9OVU1CRVIsdik7Yi5zZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNLGMpOzE+Yz9kJiYobD0tMSprLHI9ZnVuY3Rpb24oKXtoJiZoKCk7Zy53cmFwVG9MYXN0KGIpfSk6Yz5iLmdldEF0dHIoZi5TRVRfU0laRSk/ZCYmKGw9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCkrayxyPWZ1bmN0aW9uKCl7aCYmCmgoKTtnLndyYXBUb0ZpcnN0KGIpfSk6bD1iLmdldEl0ZW1PZmZzZXQoYyk7cj8oYi5zZXRBdHRyKGYuQ1VSUkVOVExZX1dSQVBQSU5HLCEwKSxhLmNhbGxiYWNrPXIsYS5lYXNpbmdGdW5jdGlvbj1hLmVhc2luZ0Z1bmN0aW9ufHxiLmdldEF0dHIoZi5XUkFQX0VBU0lORyksYS5hbmltYXRpb25TcGVlZD0xLjMqKGUuaXNGaW5pdGVOdW1iZXIoYS5hbmltYXRpb25TcGVlZCk/YS5hbmltYXRpb25TcGVlZDpiLmdldEF0dHIoZi5BTklNQVRJT05fU1BFRUQpKSk6YS5jYWxsYmFjaz1oOyExIT09bCYmdGhpcy5nb3RvUGl4ZWwoYixsLGEpfSxnb3RvUGl4ZWw6ZnVuY3Rpb24oYixjLGEpe3ZhciBkPWIuZ2V0QXR0cihmLkNVUlJFTlRfUElYRUwpO2lmKGMhPT1kKXthPWF8fHt9O3ZhciBoPWEuZWFzaW5nRnVuY3Rpb258fCJlYXNlLW91dCIsZz1hLmNhbGxiYWNrO2IuZ2V0Vmlld3BvcnRXaWR0aCgpO3ZhciBsO3ZvaWQgMCE9PWEuYW5pbWF0aW9uRHVyYXRpb24/bD1hLmFuaW1hdGlvbkR1cmF0aW9uOgoobD1lLmlzRmluaXRlTnVtYmVyKGEuYW5pbWF0aW9uU3BlZWQpP2EuYW5pbWF0aW9uU3BlZWQ6Yi5nZXRBdHRyKGYuQU5JTUFUSU9OX1NQRUVEKSxkPU1hdGguYWJzKGMtZCksbD0wPT09bD8wOk1hdGguZmxvb3IoZC9sKjFFMykpOzA8bCYmIWEuc2lsZW50JiZiLnNldEF0dHIoZi5BTklNQVRJTkcsITApO2UuaXNGaW5pdGVOdW1iZXIoYyk/KGQ9MDxsP2Z1bmN0aW9uKCl7ZyYmZygpO2IuZ2V0QXR0cihmLkNVUlJFTlRMWV9XUkFQUElORyl8fGIuc2V0QXR0cihmLkFOSU1BVElORyxlLmlzQW5pbWF0ZWQoYi5kb20uJGNhcm91c2VsKSxhLnNpbGVudCl9OmcsYi5zZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCxjKSxlLmFuaW1hdGUoYi5kb20uJGNhcm91c2VsLHtsZWZ0Oi0xKmN9LGwsaCxkKSk6bi5lcnJvcigiVGFyZ2V0IHBpeGVsIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIiLCJhLWNhcm91c2VsLXRyYW5zaXRpb24tc2xpZGUiLCJnb3RvUGl4ZWwiKX19LGdvdG9OZXh0UGFnZTpmdW5jdGlvbihiLApjKXt2YXIgYT1iLmdldEF0dHIoZi5QQUdFX05VTUJFUik7dGhpcy5nb3RvUGFnZShiLCsrYSxjKX0sZ290b1ByZXZQYWdlOmZ1bmN0aW9uKGIsYyl7dmFyIGE9Yi5nZXRBdHRyKGYuUEFHRV9OVU1CRVIpO3RoaXMuZ290b1BhZ2UoYiwtLWEsYyl9LG9uU3dpcGU6ZnVuY3Rpb24oYixjKXtpZighYi5nZXRBdHRyKGYuQ1VSUkVOVExZX1dSQVBQSU5HKSl7dmFyIGE9Yi5nZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNKSxkPWIuZ2V0QXR0cihmLlBBR0VfU0laRSksaD1iLmdldEF0dHIoZi5QQUdFX05VTUJFUiksZz0wPmMudmVsb2NpdHlYLGw9YTtnJiZoPGIuZ2V0QXR0cihmLlRPVEFMX1BBR0VTKT9sPWErZDohZyYmMTxoJiYobD1hLWQpO2Q9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCk7aD1iLmdldEl0ZW1PZmZzZXQobCk7Yz1NYXRoLmFicygxRTMqKGc/ZC1oOmQraCkvYy52ZWxvY2l0eVgpO2M9TWF0aC5tYXgoYywzMDApO2M9TWF0aC5taW4oYywxLjIqZS52aWV3cG9ydCgpLndpZHRoKTsKYz17YW5pbWF0aW9uRHVyYXRpb246YyxlYXNpbmdGdW5jdGlvbjpiLmdldEF0dHIoZi5UT1VDSF9FQVNJTkcpfTtsIT09YXx8Yi5nZXRBdHRyKCJjaXJjdWxhciIpP2c/Yi5nb3RvTmV4dFBhZ2UoYyk6Yi5nb3RvUHJldlBhZ2UoYyk6KGMuYW5pbWF0aW9uU3BlZWQ9Ljk1KmUudmlld3BvcnQoKS53aWR0aCxkZWxldGUgYy5hbmltYXRpb25EdXJhdGlvbixiLmdvdG9JbmRleChsLGMpKX19LG9uUGFuOmZ1bmN0aW9uKGIsYyl7aWYoIWIuZ2V0QXR0cihmLkNVUlJFTlRMWV9XUkFQUElORykpe2Iuc2V0QXR0cihmLkFOSU1BVElORywhMCk7dmFyIGE9Yi5nZXRJdGVtT2Zmc2V0KGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLGQ9YS1jLnRvdWNoRGVsdGFYLGg9Yi5nZXRBdHRyKGYuQ0lSQ1VMQVIpLGc9Yi5nZXRBdHRyKGYuUEFHRV9OVU1CRVIpLGw9Yi5nZXRBdHRyKGYuVE9UQUxfUEFHRVMpO2MuZW5kZWQ/KGE9e2Vhc2luZ0Z1bmN0aW9uOmIuZ2V0QXR0cihmLlRPVUNIX0VBU0lORyksCmFuaW1hdGlvblNwZWVkOi45NSplLnZpZXdwb3J0KCkud2lkdGgsc2lsZW50OiEwfSxjPWMudG91Y2hEZWx0YVgsZD1NYXRoLmFicyhjKTwuNCpiLmdldFZpZXdwb3J0V2lkdGgoKSwhaCYmKDA+YyYmbD09PWd8fDA8YyYmMT09PWcpfHxkP2IuZ290b1BhZ2UoZyxhKTowPmM/Yi5nb3RvTmV4dFBhZ2UoYSk6Yi5nb3RvUHJldlBhZ2UoYSkpOighaCYmKGg9Yi5nZXRBdHRyKGYuU1BSSU5HSU5FU1MpLDA+ZCYmMDxjLnRvdWNoRGVsdGFYfHxnPT09bCYmMD5jLnRvdWNoRGVsdGFYKSYmKGc9TWF0aC5wb3coTWF0aC5hYnMoYy50b3VjaERlbHRhWCksaCksZD0wPj1kPy0xKmc6YStnKSxiLmdvdG9QaXhlbChkLHtlYXNpbmdGdW5jdGlvbjpiLmdldEF0dHIoZi5UT1VDSF9FQVNJTkcpLGFuaW1hdGlvbkR1cmF0aW9uOjAsc2lsZW50OiEwfSkpfX0saW5pdDpmdW5jdGlvbihiKXt2YXIgYz1iLmdldEF0dHIoZi5BTklNQVRJT05fU1BFRUQpO2UuaXNGaW5pdGVOdW1iZXIoYyl8fGIuc2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCwKbCk7dm9pZCAwPT09Yi5nZXRBdHRyKGYuV1JBUF9FQVNJTkcpJiZiLnNldEF0dHIoZi5XUkFQX0VBU0lORywibGluZWFyIik7ZChiKTtiLm9uQ2hhbmdlKGYuRkVUQ0hFRF9JVEVNUyxmdW5jdGlvbihhLGMpe2goYixhLGMpfSk7Yi5vbkNoYW5nZShmLlNFVF9TSVpFLGZ1bmN0aW9uKGEsYyl7YT5jJiZkKGIpfSl9fX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJhLWNhcm91c2VsLXV0aWxzIiwiYS1jYXJvdXNlbC1jaXJjdWxhci11dGlscyIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtdHJhbnNpdGlvbi1zbGlkZWNpcmN1bGFyIixmdW5jdGlvbihlLGcsayxmKXtmdW5jdGlvbiBkKGEpe3ZhciBjPWEuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5sZW5ndGgsZD1hLmdldEF0dHIoZi5TRVRfU0laRSksaD1kLWMsZz1iKGEsYyk7MDxoJiYoYys9MSxoPWUubWFwKGUucmFuZ2UoYyxjK2gpLGZ1bmN0aW9uKGMpe3JldHVybiBhLmdldEVtcHR5Q2FyZChjLApkKX0pLGcuYWZ0ZXIoaC5qb2luKCIiKSksYS5tZWFzdXJlKCJpdGVtcyIpKX1mdW5jdGlvbiBoKGIsZCl7dmFyIGU9Yi5nZXRBdHRyKGYuU0VUX1NJWkUpO2lmKDI8Yi5nZXRBdHRyKGYuU0VUX1NJWkUpKXt2YXIgaD1hKGIsYi5nZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNKSksZz1NYXRoLnJvdW5kKGIuZ2V0QXR0cihmLlNFVF9TSVpFKS8yKSxlPWwoZyxoLGUpOzAhPT1lLnF1YW50aXR5JiYobShiLGUuZGlyZWN0aW9uLGUucXVhbnRpdHkpLGg9ZS5kaXJlY3Rpb249PT12LkNMT0NLV0lTRT9oLWUucXVhbnRpdHk6aCtlLnF1YW50aXR5LGQuZ290b1BpeGVsKGIsYyhiLGgpLHthbmltYXRpb25EdXJhdGlvbjowfSkpfX1mdW5jdGlvbiBsKGEsYyxiKXt2YXIgZD17fTthPT09Yz9hPWM9MDphPmM/KGM9YS1jLGE9Yi1jKTooYT1jLWEsYz1iLWEpO2QuZGlyZWN0aW9uPWE8PWM/di5DTE9DS1dJU0U6di5DT1VOVEVSX0NMT0NLV0lTRTtkLnF1YW50aXR5PU1hdGgubWluKGEsYyk7cmV0dXJuIGR9CmZ1bmN0aW9uIGIoYyxiKXtyZXR1cm4gYy5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpLmVxKGEoYyxiKS0xKX1mdW5jdGlvbiBjKGEsYyl7dmFyIGI9TWF0aC5mbG9vcihhLmdldEF0dHIoZi5QRUVLX1dJRFRIKXx8MCk7cmV0dXJuIGEuZ2V0SXRlbU9mZnNldChjKS1ifWZ1bmN0aW9uIGEoYSxjKXtjPWN8fDE7dmFyIGI9YS5nZXRBdHRyKCJ0cmFuc2l0aW9uU2xpZGVDaXJjdWxhckZpcnN0Q2FyZEluZGV4Iik7YT1hLmdldEF0dHIoZi5TRVRfU0laRSk7cmV0dXJuIGsucmVsYXRpdmVJbmRleEZyb21JbmRleChjLGIsYSl9ZnVuY3Rpb24gcShjLGQsaCl7aWYoYy5nZXRBdHRyKGYuQU5JTUFUSU5HKSljLm9uY2UoZi5BTklNQVRJTkcsZnVuY3Rpb24oKXtxKGMsZCxoKX0pO2Vsc2V7dmFyIGw9Yy5nZXREaW1lbnNpb25zKCkuaXRlbXMsaz1NYXRoLm1pbihkLmxlbmd0aCxjLmdldEF0dHIoZi5TRVRfU0laRSkpO2lmKCFofHxkLmxlbmd0aD49aC5sZW5ndGgpYy5zZXRBdHRyKGYuTE9BRElORywKITApLGUuZWFjaChlLnJhbmdlKGspLGZ1bmN0aW9uKGYpe3ZhciBrPWYrMSxwPWRbZl0sbT1iKGMsaykscT1wJiYhKCEwPT09cHx8ITA9PT1wLmNvbnRlbnQpO3AmJiFlLmVxdWFscyhwLGhbZl0pJiZtLmxlbmd0aCYmcSYmKGs9YShjLGspLGxba109e3dpZHRoOm0ub3V0ZXJXaWR0aCgpLG91dGVyV2lkdGg6bS5vdXRlcldpZHRoKCEwKSxoZWlnaHQ6bS5vdXRlckhlaWdodCgpLG91dGVySGVpZ2h0Om0ub3V0ZXJIZWlnaHQoITApfSxnLmFkZEVsZW1lbnRUb0RvbShtLGcuZ2V0RWxlbWVudEZyb21JdGVtKHApKSxkW2ZdPWcuY2xlYXJFbGVtZW50RnJvbUl0ZW0ocCkpfSksYy5zZXRBdHRyKGYuTE9BRElORywhMSk7Yy5zZXRBdHRyKGYuRkVUQ0hFRF9JVEVNUyxkKTtjLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7aXRlbXM6bH0pfX1mdW5jdGlvbiB1KGEpe3ZhciBjPXtyZWFjaGVkOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCEoMjxhLmdldEF0dHIoZi5TRVRfU0laRSkpKXt2YXIgYj1hLmdldEF0dHIoZi5QQUdFX05VTUJFUik7CmE9YS5nZXRBdHRyKGYuU0VUX1NJWkUpOzE9PT1iJiYoYy5yZWFjaGVkPSEwLGMubGVmdD0hMCk7Yj09PWEmJihjLnJlYWNoZWQ9ITAsYy5yaWdodD0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gcChhLGMsYil7dmFyIGQ9dShhKSxlPWEuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKTtkLnJlYWNoZWQmJmRbY10/YS5nb3RvUGFnZShlKTooInJpZ2h0Ij09PWM/YS5nb3RvTmV4dFBhZ2U6YS5nb3RvUHJldlBhZ2UpLmNhbGwoYSxiKX1mdW5jdGlvbiBtKGEsYyxiKXt2YXIgZD1hLmdldEF0dHIoInRyYW5zaXRpb25TbGlkZUNpcmN1bGFyRmlyc3RDYXJkSW5kZXgiKXx8MSxlPWEuZ2V0QXR0cihmLlNFVF9TSVpFKSxoPWEuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKSxnPWEuZG9tLiRjYXJvdXNlbDtjPT09di5DTE9DS1dJU0U/KGsucm90YXRlQ1coZyxoLGIpLGQ9ay5maXJzdENhcmRJbmRleEFmdGVyUm90YXRlKGIsZCxlKSk6KGsucm90YXRlQ0NXKGEuZG9tLiRjYXJvdXNlbCxhLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksCmIpLGQ9ay5maXJzdENhcmRJbmRleEFmdGVyUm90YXRlKC0xKmIsZCxlKSk7YS5zZXRBdHRyKCJ0cmFuc2l0aW9uU2xpZGVDaXJjdWxhckZpcnN0Q2FyZEluZGV4IixkKTtiPWJ8fDE7Yz1jfHx2LkNMT0NLV0lTRTtkPWEuZ2V0RGltZW5zaW9ucygpLml0ZW1zO2Q9Yz09PXYuQ0xPQ0tXSVNFP2sucm90YXRlQXJyYXlDVyhkLGIpOmsucm90YXRlQXJyYXlDQ1coZCxiKTthLnVwZGF0ZURpbWVuc2lvbnNDYWNoZSh7aXRlbXM6ZH0pfWZ1bmN0aW9uIEEoYixkLGcsbCxrKXt2YXIgcD1rLmNhbGxiYWNrLEI9YShiLGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLHE9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCktYyhiLEIpO2Uuc2VxdWVuY2UoZnVuY3Rpb24oYSl7bShiLGQsbCk7YSgpfSxmdW5jdGlvbihhKXtnLmdvdG9QaXhlbChiLGMoYixkPT09di5DTE9DS1dJU0U/Qi1sOkIrbCkrcSx7YW5pbWF0aW9uRHVyYXRpb246MCxjYWxsYmFjazphfSl9LGZ1bmN0aW9uKGEpe2suY2FsbGJhY2s9CmE7Zy5nb3RvUGl4ZWwoYixjKGIsQiksayl9LGZ1bmN0aW9uKGEpe2goYixnKTthKCl9LGZ1bmN0aW9uKGEpe3AmJnAoKTthKCl9KSgpfXZhciB2PXtDTE9DS1dJU0U6MSxDT1VOVEVSX0NMT0NLV0lTRTotMX0scj1lLmNhcGFiaWxpdGllcy50b3VjaD8yRTM6M0UzLHQ9e307dFtmLkhJREVfT0ZGX1NDUkVFTl09ITE7dFtmLkFOSU1BVElPTl9TUEVFRF09ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBlLmlzRmluaXRlTnVtYmVyKGMpP2M6YX19KHIpO3QudHJhbnNpdGlvblNsaWRlQ2lyY3VsYXJGaXJzdENhcmRJbmRleD0xO3JldHVybntpbml0QXR0cnM6dCxpbml0OmZ1bmN0aW9uKGEpe2QoYSk7YS5vbkNoYW5nZShmLkZFVENIRURfSVRFTVMsZnVuY3Rpb24oYyxiKXtxKGEsYyxiKTthLnN0cmF0ZWdpZXMuZGlzcGxheS5yZXBhaW50KGEpfSk7YS5vbkNoYW5nZShmLlNFVF9TSVpFLGZ1bmN0aW9uKGMsYil7Yz5iJiZkKGEpfSk7YS5vbkNoYW5nZShmLlBFRUtfV0lEVEgsCmZ1bmN0aW9uKGMsYil7YyE9PWImJihjPWEuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSksYS5nb3RvSW5kZXgoYykpfSl9LGFmdGVySW5pdDpmdW5jdGlvbihhKXtoKGEsdGhpcyk7YS5zdHJhdGVnaWVzLmRpc3BsYXkucmVwYWludChhKTthLmdvdG9QYWdlKGEuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKSl9LGdvdG9QYWdlOmZ1bmN0aW9uKGEsYyxiKXtiPWJ8fHt9O3ZhciBkPWEuZ2V0QXR0cihmLlRPVEFMX1BBR0VTKTswPGMmJmM8PWQmJihhLnNldEF0dHIoZi5QQUdFX05VTUJFUixjKSx0aGlzLmdvdG9JbmRleChhLGEuZ2V0QXR0cihmLlBBR0VfU0laRSkqKGMtMSkrMSxiKSl9LGdvdG9JbmRleDpmdW5jdGlvbihiLGQsZSl7dmFyIGg9Yi5nZXRBdHRyKGYuU0VUX1NJWkUpLGc9YShiLGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLGs9YShiLGQpO2c9PT1rP3RoaXMuZ290b1BpeGVsKGIsYyhiLGcpLGUpOigyPGIuZ2V0QXR0cihmLlNFVF9TSVpFKT8oaD1sKGcsaywKaCksZS5zdGFydG92ZXImJig1PGgucXVhbnRpdHk/ZS5hbmltYXRpb25EdXJhdGlvbj0xMjUwOihkZWxldGUgZS5hbmltYXRpb25EdXJhdGlvbixlLmFuaW1hdGlvblNwZWVkPTUqYi5nZXREaW1lbnNpb25zKCkudmlld3BvcnQud2lkdGgpKSxBKGIsaC5kaXJlY3Rpb24sdGhpcyxoLnF1YW50aXR5LGUpKTp0aGlzLmdvdG9QaXhlbChiLGMoYixkKSxlKSxiLnNldEF0dHIoZi5GSVJTVF9WSVNJQkxFX0lURU0sZCkpfSxnb3RvUGl4ZWw6ZnVuY3Rpb24oYSxjLGIpe3ZhciBkPWEuZ2V0QXR0cihmLkNVUlJFTlRfUElYRUwpO2lmKGMhPT1kKXtlLmlzRmluaXRlTnVtYmVyKGMpfHxuLmVycm9yKCJUYXJnZXQgcGl4ZWwgaXMgbm90IGEgZmluaXRlIG51bWJlciIsImEtY2Fyb3VzZWwtdHJhbnNpdGlvbi1zbGlkZS1jaXJjdWxhciIsImdvdG9QaXhlbCIpO2I9Ynx8e307dmFyIGg9Yi5lYXNpbmdGdW5jdGlvbnx8ImVhc2Utb3V0IixnPWIuY2FsbGJhY2ssbDt2b2lkIDAhPT1iLmFuaW1hdGlvbkR1cmF0aW9uPwpsPWIuYW5pbWF0aW9uRHVyYXRpb246KGw9ZS5pc0Zpbml0ZU51bWJlcihiLmFuaW1hdGlvblNwZWVkKT9iLmFuaW1hdGlvblNwZWVkOmEuZ2V0QXR0cihmLkFOSU1BVElPTl9TUEVFRCksZD1NYXRoLmFicyhjLWQpLGw9MD09PWw/MDpNYXRoLmZsb29yKGQvbCoxRTMpKTswPGwmJighYi5zaWxlbnQmJmEuc2V0QXR0cihmLkFOSU1BVElORywhMCksZz1mdW5jdGlvbigpe2IuY2FsbGJhY2smJmIuY2FsbGJhY2soKTthLnNldEF0dHIoZi5BTklNQVRJTkcsZS5pc0FuaW1hdGVkKGEuZG9tLiRjYXJvdXNlbCksYi5zaWxlbnQpfSk7YS5zZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCxjKTtlLmFuaW1hdGUoYS5kb20uJGNhcm91c2VsLHtsZWZ0Oi0xKmN9LGwsaCxnKX19LGdvdG9OZXh0UGFnZTpmdW5jdGlvbihhLGMpe3ZhciBiPWEuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKSxiPWI9PT1hLmdldEF0dHIoZi5UT1RBTF9QQUdFUyk/MTpiKzE7dGhpcy5nb3RvUGFnZShhLGIsYyl9LGdvdG9QcmV2UGFnZTpmdW5jdGlvbihhLApjKXt2YXIgYj1hLmdldEF0dHIoZi5QQUdFX05VTUJFUiksYj0xPT09Yj9hLmdldEF0dHIoZi5UT1RBTF9QQUdFUyk6Yi0xO3RoaXMuZ290b1BhZ2UoYSxiLGMpfSxvblN3aXBlOmZ1bmN0aW9uKGIsZCl7dmFyIGg9Yi5nZXRBdHRyKGYuQ1VSUkVOVF9QSVhFTCksZz1iLmdldEF0dHIoZi5QQUdFX1NJWkUpLGw9YShiLGIuZ2V0QXR0cihmLkZJUlNUX1ZJU0lCTEVfSVRFTSkpLGs9MD5kLnZlbG9jaXR5WCxnPWMoYixrP2wrZzpsLWcpLGg9TWF0aC5hYnMoMUUzKihrP2gtZzpoK2cpL2QudmVsb2NpdHlYKSxrPTEuMiplLnZpZXdwb3J0KCkud2lkdGg7cChiLDA+ZC50b3VjaERlbHRhWD8icmlnaHQiOiJsZWZ0Iix7YW5pbWF0aW9uRHVyYXRpb246TWF0aC5taW4oTWF0aC5tYXgoaCwzMDApLGspLGVhc2luZ0Z1bmN0aW9uOmIuZ2V0QXR0cihmLlRPVUNIX0VBU0lORyl9KX0sb25QYW46ZnVuY3Rpb24oYixkKXtiLnNldEF0dHIoZi5BTklNQVRJTkcsITApO3ZhciBoPWIuZ2V0QXR0cihmLlBBR0VfTlVNQkVSKSwKZz1hKGIsYi5nZXRBdHRyKGYuRklSU1RfVklTSUJMRV9JVEVNKSksZz1jKGIsZyksZz11KGIpLnJlYWNoZWQ/Zy0uNCpkLnRvdWNoRGVsdGFYOmctZC50b3VjaERlbHRhWDtkLmVuZGVkPyhnPXtlYXNpbmdGdW5jdGlvbjpiLmdldEF0dHIoZi5UT1VDSF9FQVNJTkcpLGFuaW1hdGlvblNwZWVkOi45NSplLnZpZXdwb3J0KCkud2lkdGgsc2lsZW50OiEwfSxNYXRoLmFicyhkLnRvdWNoRGVsdGFYKT49LjQqYi5nZXRWaWV3cG9ydFdpZHRoKCk/cChiLDA+ZC50b3VjaERlbHRhWD8icmlnaHQiOiJsZWZ0IixnKTpiLmdvdG9QYWdlKGgsZykpOmIuZ290b1BpeGVsKGcse2Vhc2luZ0Z1bmN0aW9uOmIuZ2V0QXR0cihmLlRPVUNIX0VBU0lORyksYW5pbWF0aW9uRHVyYXRpb246MCxzaWxlbnQ6ITB9KX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtdXRpbHMiLCJhLWNhcm91c2VsLWNvbnN0YW50cyIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXRyYW5zaXRpb24tZnJlZXNjcm9sbCIsCmZ1bmN0aW9uKGUsZyxrKXtmdW5jdGlvbiBmKGMpe2FbYy5fX2lkXXx8KGFbYy5fX2lkXT1uZXcgcShjKSk7cmV0dXJuIGFbYy5fX2lkXX1mdW5jdGlvbiBkKGEpe2Zvcih2YXIgYz1hLmNvdW50SXRlbXMoKSxiPVtdLGQ9MDtkPGM7ZCsrKWIucHVzaCghMCk7YS5zZXRBdHRyKGsuRkVUQ0hFRF9JVEVNUyxiKX1mdW5jdGlvbiBoKGEpe3ZhciBjPWEuY291bnRJdGVtcygpLGI9YS5nZXRBdHRyKGsuU0VUX1NJWkUpLGQ9W10sZTtpZihiPmMpe2Zvcih2YXIgZj0wO2Y8Yi1jO2YrKyllPWMrZisxLGQucHVzaChhLmdldEVtcHR5Q2FyZChlLGIpKTthLmFwcGVuZEl0ZW1zKGQpfX1mdW5jdGlvbiBsKGEsYyxiKXtpZighYnx8Yy5sZW5ndGg+PWIubGVuZ3RoKWZvcih2YXIgZD1hLmdldEl0ZW1zKCksZj1jLmxlbmd0aCxoO2YtLTspKGg9Y1tmXSkmJiFlLmVxdWFscyhoLGJbZl0pJiYhMCE9PWgmJiEwIT09aC5jb250ZW50JiZhLmhhc0l0ZW0oZCxmKSYmKGNbZl09YS5pbnNlcnRGZXRjaGVkSXRlbShoLApkLGYpKTthLnNldEF0dHIoay5GRVRDSEVEX0lURU1TLGMpfWZ1bmN0aW9uIGIoYSl7YS5oYXNFbXB0eUNhcmQoKSYmYS5hdHRhY2hTY3JvbGxMaXN0ZW5lcihmdW5jdGlvbigpe2EudGhyb3R0bGUoImRldGVjdCIsYyl9KX1mdW5jdGlvbiBjKGEpe3ZhciBiPWEuZ2V0QXR0cigibG9hZGluZ190aHJlc2hvbGRfcGl4ZWxzIiksZD1hLm1lYXN1cmVXaWR0aCgpLGU9YS5nZXRGaXJzdEVtcHR5RGV0YWlscygpOy0xIT09ZS5pbmRleCYmZS5sZWZ0PGQrYj9hLndhbnROZXh0KGUuaW5kZXgsYS5nZXRBdHRyKCJuZXh0X3JlcXVlc3Rfc2l6ZSIpKTooYS5wcmV2aW91c0NhcmRMZWZ0JiZhLnByZXZpb3VzQ2FyZExlZnQhPT1lLmxlZnQmJmEudGhyb3R0bGUoImRldGVjdCIsYyksYS5wcmV2aW91c0NhcmRMZWZ0PWUubGVmdCl9dmFyIGE9e30scT1mdW5jdGlvbihhKXt0aGlzLmNhcm91c2VsPWF9O2UuZXh0ZW5kKHEucHJvdG90eXBlLHtzZXRBdHRyOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuY2Fyb3VzZWwuc2V0QXR0cihhLApjKX0sZ2V0QXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jYXJvdXNlbC5nZXRBdHRyKGEpfSxvbkNoYW5nZTpmdW5jdGlvbihhLGMpe3RoaXMuY2Fyb3VzZWwub25DaGFuZ2UoYSxjKX0sZ2V0SXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYXJvdXNlbC5kb20uJGNhcm91c2VsLmNoaWxkcmVuKCJsaSIpfSxjb3VudEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0SXRlbXMoKS5sZW5ndGh9LHNob3dJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEl0ZW1zKCkuY3NzKCJ2aXNpYmlsaXR5IiwiIikuYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpfSxnZXRFbXB0eUNhcmQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5jYXJvdXNlbC5nZXRFbXB0eUNhcmQoYSxjKX0sZ2V0RW1wdHlDYXJkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhcm91c2VsLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oIi5hLWNhcm91c2VsLWNhcmQtZW1wdHkiKX0saGFzRW1wdHlDYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIDA8CnRoaXMuZ2V0RW1wdHlDYXJkcygpLmxlbmd0aH0sZ2V0Rmlyc3RFbXB0eURldGFpbHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEVtcHR5Q2FyZHMoKTtyZXR1cm4gMDxhLmxlbmd0aD8oYT1hLmZpcnN0KCkse2luZGV4OmEuaW5kZXgoKSxsZWZ0OmEucG9zaXRpb24oKS5sZWZ0fSk6e2luZGV4Oi0xLGxlZnQ6LTF9fSxhcHBlbmRJdGVtczpmdW5jdGlvbihhKXt0aGlzLmNhcm91c2VsLmRvbS4kY2Fyb3VzZWwuYXBwZW5kKGEuam9pbigiIikpfSxoYXNJdGVtOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDA8YS5lcShjKS5sZW5ndGh9LGluc2VydEZldGNoZWRJdGVtOmZ1bmN0aW9uKGEsYyxiKXtnLmFkZEVsZW1lbnRUb0RvbShjLmVxKGIpLGcuZ2V0RWxlbWVudEZyb21JdGVtKGEpKTtyZXR1cm4gZy5jbGVhckVsZW1lbnRGcm9tSXRlbShhKX0sYXR0YWNoU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYSl7dGhpcy5jYXJvdXNlbC5kb20uJGNhcm91c2VsLmJpbmQoZS5hY3Rpb24ubW92ZSsiLmEtY2Fyb3VzZWwtZnJlZVNjcm9sbCBzY3JvbGwuYS1jYXJvdXNlbC1mcmVlU2Nyb2xsIiwKYSl9LGRldGFjaFNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKGEpe3RoaXMuY2Fyb3VzZWwuZG9tLiRjYXJvdXNlbC51bmJpbmQoIi5hLWNhcm91c2VsLWZyZWVTY3JvbGwiKX0sbWVhc3VyZVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Fyb3VzZWwuZG9tLiRjYXJvdXNlbC5vdXRlcldpZHRoKCl9LHdhbnROZXh0OmZ1bmN0aW9uKGEsYyl7dGhpcy5jYXJvdXNlbC5zdHJhdGVnaWVzLmFqYXgud2FudCh0aGlzLmNhcm91c2VsLGEsYyl9LHRocm90dGxlOmZ1bmN0aW9uKGEsYyl7dmFyIGI9dGhpcztjbGVhclRpbWVvdXQoYlthXSk7YlthXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhiKX0sMTAwKX19KTt2YXIgdT17YWpheExvY2s6ITB9O3Vbay5OT19UUkFOU0lUSU9OXT0hMDt1W2suSElERV9PRkZfU0NSRUVOXT0hMTt1W2suQVVUT19BREpVU1RfSEVJR0hUXT0hMTt1Lm5leHRfcmVxdWVzdF9zaXplPTEwO3UubG9hZGluZ190aHJlc2hvbGRfcGl4ZWxzPTQwMDtyZXR1cm57Z290b0luZGV4OmUuY29uc3RhbnRzLk5PT1AsCmdvdG9OZXh0cGFnZTplLmNvbnN0YW50cy5OT09QLGdvdG9QcmV2UGFnZTplLmNvbnN0YW50cy5OT09QLGdvdG9QYWdlOmUuY29uc3RhbnRzLk5PT1AsaW5pdEF0dHJzOnUsaW5pdDpmdW5jdGlvbihhKXt2YXIgZz1mKGEpO2cuc2hvd0l0ZW1zKCk7ZChnKTtoKGcpO2IoZyk7Zy5vbkNoYW5nZShrLkZFVENIRURfSVRFTVMsZnVuY3Rpb24oYSxiKXtjKGcpO2woZyxhLGIpO2cuaGFzRW1wdHlDYXJkKCl8fGcuZGV0YWNoU2Nyb2xsTGlzdGVuZXIoKX0pO2Uub24ucmVzaXplKGZ1bmN0aW9uKCl7YyhnKX0pfSxhZnRlckluaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtlLmRlbGF5KGZ1bmN0aW9uKCl7Yi5zZXRBdHRyKCJhamF4TG9jayIsITEpO2MoYil9KX0scHJlcGFyZUZldGNoZWRJdGVtczpkLGFkZEVtcHR5Q2FyZHM6aCxoYW5kbGVJdGVtQ2hhbmdlczpsLGRldGVjdEVtcHR5Q2FyZHNMb2FkaW5nVGhyZXNob2xkOmMsQVRUUjp7TkVYVF9SRVFVRVNUX1NJWkU6Im5leHRfcmVxdWVzdF9zaXplIiwKTE9BRElOR19USFJFU0hPTERfUElYRUxTOiJsb2FkaW5nX3RocmVzaG9sZF9waXhlbHMifX19KTsidXNlIHN0cmljdCI7bi53aGVuKCJBIiwialF1ZXJ5IiwiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXNsaWRlIiwiYS1jYXJvdXNlbC10cmFuc2l0aW9uLXN3YXAiLCJhLWNhcm91c2VsLXRyYW5zaXRpb24tZnJlZXNjcm9sbCIsImEtY2Fyb3VzZWwtdHJhbnNpdGlvbi1zbGlkZWNpcmN1bGFyIiwiYS1jYXJvdXNlbC1jb25zdGFudHMiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1zdHJhdGVnaWVzLXRyYW5zaXRpb24iLGZ1bmN0aW9uKGUsZyxrLGYsZCxoLGwpe2c9e307Z1tsLk5PX1RSQU5TSVRJT05dPSEwO2dbbC5ISURFX09GRl9TQ1JFRU5dPSExO2dbbC5BVVRPX0FESlVTVF9IRUlHSFRdPSExO3JldHVybntzbGlkZUhvcml6b250YWw6ayxzd2FwOmYsZnJlZVNjcm9sbDpkLHNsaWRlQ2lyY3VsYXI6aCxub25lOntnb3RvSW5kZXg6ZS5jb25zdGFudHMuTk9PUCxnb3RvTmV4dFBhZ2U6ZS5jb25zdGFudHMuTk9PUCwKZ290b1ByZXZQYWdlOmUuY29uc3RhbnRzLk5PT1AsZ290b1BhZ2U6ZS5jb25zdGFudHMuTk9PUCxpbml0QXR0cnM6Zyxpbml0OmZ1bmN0aW9uKGIpe2IuZG9tLiRjYXJvdXNlbC5jaGlsZHJlbigibGkiKS5jc3MoInZpc2liaWxpdHkiLCIiKS5hdHRyKCJhcmlhLWhpZGRlbiIsImZhbHNlIil9fSwiZGVmYXVsdCI6InNsaWRlSG9yaXpvbnRhbCJ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLWFqYXgtc3RhbmRhcmQiLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGcoZCxoLGcpe2QudHJpZ2dlckV2ZW50KCJiZWZvcmVBamF4Iix7dXJsOmgscGFyYW1zOmd9KTtlLmdldChoLHtjYWNoZTohMSxzdWNjZXNzOmZ1bmN0aW9uKGIpe2I9ZS5pc0FycmF5KGIpP2I6YiE9PWYmJm51bGwhPT1iJiYhZS5vYmplY3RJc0VtcHR5KGIpJiZiLmhhc093blByb3BlcnR5KCJkYXRhIikmJmUuaXNBcnJheShiLmRhdGEpP2IuZGF0YTpudWxsO2lmKG51bGw9PT1iKW4uZXJyb3IoIkludmFsaWQgSlNPTiByZXR1cm5lZCB0byBjYXJvdXNlbCBmcm9tICIrCmgrIiAtIHNlZSBodHRwOi8vdGlueS9jMW1yNWgwdSBmb3IgZGV0YWlscy4iLCJhLWNhcm91c2VsLWFqYXgtc3RhbmRhcmQiLCJzZW5kUmVxdWVzdCIpO2Vsc2V7Zy5uZWVkU2V0U2l6ZSYmKGImJmIubGVuZ3RofHxuLmVycm9yKCJDYXJvdXNlbCByZXF1aXJlcyBhIHNldF9zaXplIGFuZCBub25lIHdhcyByZXR1cm5lZCBieSB0aGUgZmFsbGJhY2sgQUpBWCByZXF1ZXN0IGF0OiAiK2gsImEtY2Fyb3VzZWwtYWpheC1zdGFuZGFyZCIsInNlbmRSZXF1ZXN0IiksZC5zZXRBdHRyKCJzZXRfc2l6ZSIsYlswXS5zZXRTaXplP2JbMF0uc2V0U2l6ZTpiLmxlbmd0aCkpO2Zvcih2YXIgYz1kLmdldEF0dHIoImZldGNoZWRJdGVtcyIpLGE7KGE9Yi5wb3AoKSkhPT1mOylhJiYoYS5jb250ZW50fHwiIj09PWEuY29udGVudD9hLmNvbnRlbnQ9ZS50cmltKGEuY29udGVudCk6YT1lLnRyaW0oYSkpLGNbZy5vZmZzZXQrYi5sZW5ndGhdPWE7Zy5uZWVkU2V0U2l6ZSYmZC5pbml0KCk7ZC5zZXRBdHRyKCJmZXRjaGVkSXRlbXMiLApjKTtkLnNldEF0dHIoImFqYXhMb2NrIiwhMSk7Zy5uZWVkU2V0U2l6ZSYmZC5nZXRBdHRyKCJwYWdlU2l6ZSIpPj1jLmxlbmd0aCYmZC5zdHJhdGVnaWVzLmFqYXgud2FudEN1cnJlbnRQYWdlKGQpO2QudHJpZ2dlckV2ZW50KCJhamF4U3VjY2VzcyIse3VybDpoLHBhcmFtczpnfSl9fSxwYXJhbXM6Z30pfWZ1bmN0aW9uIGsoZCl7dmFyIGU9ZC5nZXRBdHRyKCJyZXF1ZXN0VGltZXIiKTtlJiYoY2xlYXJUaW1lb3V0KGUpLGQuc2V0QXR0cigicmVxdWVzdFRpbWVyIixudWxsKSl9dmFyIGY7cmV0dXJue2dldEl0ZW1zOmZ1bmN0aW9uKGQsZixsKXt2YXIgYj1kLmdldEF0dHIoImFqYXgiKTtkLnNldEF0dHIoInJlcXVlc3RUaW1lciIsZS5kZWxheShnLGIuZmV0Y2hfZGVsYXksZCxmLGwpKX0sd2FudE5leHRQYWdlOmZ1bmN0aW9uKGQpe2soZCk7aWYoZC5nZXRBdHRyKCJhamF4IikucHJlZmV0Y2hfbmV4dF9wYWdlKXt2YXIgZT1kLmdldEF0dHIoInBhZ2VTaXplIiksZj0yKmU7ZC5nZXRBdHRyKCJzaG93X3BhcnRpYWxfbmV4dCIpJiYKZisrO3RoaXMud2FudChkLChkLmdldEF0dHIoInBhZ2VOdW1iZXIiKS0xKSplLGYpfWVsc2UgdGhpcy53YW50Q3VycmVudFBhZ2UoZCl9LHdhbnRQcmV2UGFnZTpmdW5jdGlvbihkKXtrKGQpO2lmKGQuZ2V0QXR0cigiYWpheCIpLnByZWZldGNoX25leHRfcGFnZSl7dmFyIGU9ZC5nZXRBdHRyKCJwYWdlU2l6ZSIpLGY9MiplO2QuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKSYmZisrO3RoaXMud2FudChkLChkLmdldEF0dHIoInBhZ2VOdW1iZXIiKS0yKSplLGYpfWVsc2UgdGhpcy53YW50Q3VycmVudFBhZ2UoZCl9LHdhbnRDdXJyZW50UGFnZTpmdW5jdGlvbihkKXtrKGQpO3ZhciBlPWQuZ2V0QXR0cigicGFnZVNpemUiKSxmPWQuZ2V0QXR0cigic2hvd19wYXJ0aWFsX25leHQiKT9lKzE6ZTt0aGlzLndhbnQoZCwoZC5nZXRBdHRyKCJwYWdlTnVtYmVyIiktMSkqZSxmKX0sd2FudDpmdW5jdGlvbihkLGUsZil7aWYoIWQuZ2V0QXR0cigiYWpheExvY2siKSl7ayhkKTt2YXIgYj1kLmdldEF0dHIoImFqYXgiKSwKYz1kLmdldEF0dHIoInNldF9zaXplIik7aWYoYi51cmwpe3ZhciBhPWQuZ2V0QXR0cigiZmV0Y2hlZEl0ZW1zIiksZz1iLmlkX2xpc3Q7Z3x8KGc9W10pO3ZhciB1PS0xPGU/ZTowO2U9ZStmLTE7dmFyIHA9Yi5wYXJhbXN8fHt9LG09W10sbj1bXTswPT09YyYmKGcubGVuZ3RoJiYoYz1nKSxwLm5lZWRTZXRTaXplPSJ0cnVlIixkLnNldEF0dHIoImFqYXhMb2NrIiwhMCkpO2ZvcigtMT09PWYmJmMmJihlPWMpO3U8PWUmJnU8YzspYVt1XXx8KChmPWdbdV0pJiZtLnB1c2goZiksbi5wdXNoKHUpLGFbdV09ITEpLHUrKztkLnNldEF0dHIoImZldGNoZWRJdGVtcyIsYSx7c2lsZW50OiEwfSk7cC5jb3VudD1uLmxlbmd0aDtwLm9mZnNldD1uWzBdfHwwOzA8bS5sZW5ndGgmJihwW2IuaWRfcGFyYW1fbmFtZV09bS5qb2luKCIsIikpOygwPG4ubGVuZ3RofHxwLm5lZWRTZXRTaXplKSYmdGhpcy5nZXRJdGVtcyhkLGIudXJsLHApfX19LGluaXQ6ZnVuY3Rpb24oZCl7dmFyIGc9ZC5nZXRBdHRyKCJhamF4Iik7CmUuaXNGaW5pdGVOdW1iZXIoZy5mZXRjaF9kZWxheSl8fChnLmZldGNoX2RlbGF5PTUwMCk7Zy5pZF9wYXJhbV9uYW1lPWcuaWRfcGFyYW1fbmFtZXx8ImlkcyI7Zy5wcmVmZXRjaF9uZXh0X3BhZ2U9Zy5wcmVmZXRjaF9uZXh0X3BhZ2U9PT1mPyEwOiEhZy5wcmVmZXRjaF9uZXh0X3BhZ2U7ZC5zZXRBdHRyKCJhamF4IixnKTtkLmdldEF0dHIoInNldF9zaXplIil8fHRoaXMud2FudChkLDAsLTEpfSxhZnRlckluaXQ6ZnVuY3Rpb24oZCl7ZC5zdHJhdGVnaWVzLmFqYXgud2FudEN1cnJlbnRQYWdlKGQpO2Qub25DaGFuZ2UoInBhZ2VOdW1iZXIiLGZ1bmN0aW9uKGUsZil7ZT5mP2Quc3RyYXRlZ2llcy5hamF4LndhbnROZXh0UGFnZShkKTpkLnN0cmF0ZWdpZXMuYWpheC53YW50UHJldlBhZ2UoZCl9KX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtYWpheC1zdGFuZGFyZCIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtYWpheCIsZnVuY3Rpb24oZSwKZyl7cmV0dXJue3N0YW5kYXJkOmcsbm9uZTp7d2FudE5leHRQYWdlOmUuY29uc3RhbnRzLk5PT1Asd2FudFByZXZQYWdlOmUuY29uc3RhbnRzLk5PT1Asd2FudEN1cnJlbnRQYWdlOmUuY29uc3RhbnRzLk5PT1Asd2FudDplLmNvbnN0YW50cy5OT09QLGluaXQ6ZS5jb25zdGFudHMuTk9PUH0sImRlZmF1bHQiOiJzdGFuZGFyZCJ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtYWNjZXNzaWJpbGl0eS1zdGFuZGFyZC1kZXNrdG9wIixmdW5jdGlvbihlLGcpe2Z1bmN0aW9uIGsoYSl7dmFyIGM9YS5kb20uJGNhcm91c2VsLGI9Yy5jaGlsZHJlbigibGkiKSxkPWEuZ2V0QXR0cihnLlBBR0VfU0laRSksZT1hLmdldEF0dHIoZy5GSVJTVF9WSVNJQkxFX0lURU0pLTE7cmV0dXJuIGEuZ2V0QXR0cihnLk5PX1RSQU5TSVRJT04pP2I6Yi5sZW5ndGg8PWQ/Yy5jaGlsZHJlbigibGk6bm90KDplbXB0eSksIGxpLmEtY2Fyb3VzZWwtY2FyZC1lbXB0eSIpOgpiLnNsaWNlKGUsZStkKX1mdW5jdGlvbiBmKGEsYyxiLGQpe3ZhciBmPWZ1bmN0aW9uKCl7dmFyIGI9ayhhKTsoYz9iLmZpcnN0KCk6Yi5sYXN0KCkpLmZpbmQoImEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleFx4M2QnLTEnXSkiKS5ub3QoIjpkaXNhYmxlZCIpLmZpcnN0KCkuZm9jdXMoKTtlLmRlbGF5KGZ1bmN0aW9uKCl7aChhKX0sYS5nZXRBdHRyKGcuUEFHRV9TSVpFKSphLmdldEF0dHIoZy5ERUxBWV9USU1FKSs1MCl9O2lmKDA9PT1ifHwwPT09ZCllLmRlbGF5KGYsMCk7ZWxzZSBhLm9uY2UoZy5BTklNQVRJTkcsZnVuY3Rpb24oYSl7YXx8ZigpfSl9ZnVuY3Rpb24gZChhKXt2YXIgYj1hLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIiksZD1hLmdldEF0dHIoZy5UUkFOU0lUSU9OX1NUUkFURUdZKSxlPWEuZ2V0QXR0cihnLlNFVF9TSVpFKSxmPWU/eyJhcmlhLXNldHNpemUiOmV9Ont9O2lmKCJzd2FwIj09PWQpe3ZhciBoPQphLmdldEF0dHIoZy5GSVJTVF9WSVNJQkxFX0lURU0pO2IuZWFjaChmdW5jdGlvbihhKXt2YXIgYj1jKHRoaXMpO2grYT5lPyhiLnJlbW92ZUF0dHIoImFyaWEtc2V0c2l6ZSIpLGIucmVtb3ZlQXR0cigiYXJpYS1wb3NpbnNldCIpKTooZlsiYXJpYS1wb3NpbnNldCJdPWgrYSxiLmF0dHIoZikpfSl9ZWxzZSBiLmVhY2goZnVuY3Rpb24oYSl7ZlsiYXJpYS1wb3NpbnNldCJdPWErMTtjKHRoaXMpLmF0dHIoZil9KX1mdW5jdGlvbiBoKGEpe2E9YS5kb20uJGNvbnRhaW5lcjthLmZpbmQoIi5hLWNhcm91c2VsLWFjY2Vzc2liaWxpdHktcGFnZS1pbmZvIikuaHRtbChhLmZpbmQoIi5hLWNhcm91c2VsLXBhZ2UtY291bnQiKS50ZXh0KCkpfWZ1bmN0aW9uIGwoYSl7YS5nZXRBdHRyKGcuVFJBTlNJVElPTl9TVFJBVEVHWSk7aWYoIWEuZ2V0QXR0cihnLk5PX1RSQU5TSVRJT04pKXt2YXIgYj1hLmRvbS4kY2Fyb3VzZWwuY2hpbGRyZW4oImxpIik7YT1rKGEpO2I9Yi5ub3QoYSk7YS5hdHRyKCJhcmlhLWhpZGRlbiIsCiExKTtiLmF0dHIoImFyaWEtaGlkZGVuIiwhMCl9fWZ1bmN0aW9uIGIoYSxiKXtpZighYS5nZXRBdHRyKGcuQ0lSQ1VMQVIpKXt2YXIgYz1hLmRvbS4kY29udGFpbmVyO2MuZmluZCgiLmEtY2Fyb3VzZWwtZ290by1wcmV2cGFnZSIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLDE9PT1iPyJ0cnVlIjoiZmFsc2UiKTtjLmZpbmQoIi5hLWNhcm91c2VsLWdvdG8tbmV4dHBhZ2UiKS5hdHRyKCJhcmlhLWRpc2FibGVkIixiPT09YS5nZXRBdHRyKGcuVE9UQUxfUEFHRVMpPyJ0cnVlIjoiZmFsc2UiKX19dmFyIGM9ZS4kO3JldHVybntpbml0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cihnLk5BTUUpO2QoYSk7bChhKTtiKGEsMSk7ZS5vbigiYTpjYXJvdXNlbCIrKGM/IjoiK25hbWU6IiIpKyI6cmVwYWludCIsZnVuY3Rpb24oKXtsKGEpfSk7YS5vbkNoYW5nZShnLlNFVF9TSVpFLGZ1bmN0aW9uKGIsYyl7ZChhKX0pO2Eub25DaGFuZ2UoZy5MT0FESU5HLGZ1bmN0aW9uKGIpe2EuZ2V0QXR0cihnLkFOSU1BVElORyl8fAphLmRvbS4kY2Fyb3VzZWwuYXR0cigiYXJpYS1idXN5IiwoISFiKS50b1N0cmluZygpKX0pO2Eub25DaGFuZ2UoZy5BTklNQVRJTkcsZnVuY3Rpb24oYil7YS5nZXRBdHRyKGcuTE9BRElORyl8fGEuZG9tLiRjYXJvdXNlbC5hdHRyKCJhcmlhLWJ1c3kiLCghIWIpLnRvU3RyaW5nKCkpOyFiJiZhLmdldEF0dHIoZy5TRVRfU0laRSk+YS5nZXRBdHRyKGcuUEFHRV9TSVpFKSYmKGI9YS5nZXRBdHRyKGcuVFJBTlNJVElPTl9TVFJBVEVHWSksbChhKSwic2xpZGUiIT09YiYmZChhKSl9KTthLm9uQ2hhbmdlKGcuUEFHRV9OVU1CRVIsZnVuY3Rpb24oYyl7YihhLGMpfSl9LGFmdGVySW5pdDpmdW5jdGlvbihhKXtoKGEpfSxnb3RvUGFnZTpmdW5jdGlvbihhLGIsYyl7YS5nZXRBdHRyKGcuTk9fVFJBTlNJVElPTil8fGYoYSwhMCxiLGMpfSxuZXh0UGFnZTpmdW5jdGlvbihhLGIsYyl7YS5nZXRBdHRyKGcuTk9fVFJBTlNJVElPTil8fGYoYSwhMCxiLGMpfSxwcmV2UGFnZTpmdW5jdGlvbihhLGIsCmMpe2EuZ2V0QXR0cihnLk5PX1RSQU5TSVRJT04pfHxmKGEsITEsYixjKX19fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtYWNjZXNzaWJpbGl0eS1zdGFuZGFyZC1tb2JpbGUiLGZ1bmN0aW9uKGUsZyl7ZnVuY3Rpb24gayhkKXt2YXIgZT1kLmRvbS4kY2Fyb3VzZWw7ZD1lLmNoaWxkcmVuKCIuYS1jYXJvdXNlbC1jYXJkLWVtcHR5Iik7dmFyIGU9ZS5jaGlsZHJlbigibGkiKS5ub3QoZCksZz1lLmxlbmd0aCxiPWc/eyJhcmlhLXNldHNpemUiOmd9Ont9O2QuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIikucmVtb3ZlQXR0cigiYXJpYS1zZXRzaXplIikucmVtb3ZlQXR0cigiYXJpYS1wb3NpbnNldCIpO2UuZWFjaChmdW5jdGlvbihjKXtiWyJhcmlhLXBvc2luc2V0Il09YysxO2JbImFyaWEtaGlkZGVuIl09ImZhbHNlIjtmKHRoaXMpLmF0dHIoYil9KX12YXIgZj1lLiQ7ZT1lLmNvbnN0YW50cy5OT09QOwpyZXR1cm57aW5pdDpmdW5jdGlvbihkKXtrKGQpO2Qub25DaGFuZ2UoZy5TRVRfU0laRSxmdW5jdGlvbigpe2soZCl9KTtkLm9uQ2hhbmdlKGcuTE9BRElORyxmdW5jdGlvbihlKXtkLmRvbS4kY2Fyb3VzZWwuYXR0cigiYXJpYS1idXN5IiwoISFlKS50b1N0cmluZygpKTtlfHxrKGQpfSl9LGdvdG9QYWdlOmUsbmV4dFBhZ2U6ZSxwcmV2UGFnZTplfX0pOyJ1c2Ugc3RyaWN0IjtuLndoZW4oIkEiLCJhLWNhcm91c2VsLWFjY2Vzc2liaWxpdHktc3RhbmRhcmQtZGVza3RvcCIsImEtY2Fyb3VzZWwtYWNjZXNzaWJpbGl0eS1zdGFuZGFyZC1tb2JpbGUiKS5yZWdpc3RlcigiYS1jYXJvdXNlbC1zdHJhdGVnaWVzLWFjY2Vzc2liaWxpdHkiLGZ1bmN0aW9uKGUsZyxrKXtyZXR1cm57c3RhbmRhcmREZXNrdG9wOmcsc3RhbmRhcmRNb2JpbGU6ayxub25lOntpbml0OmUuY29uc3RhbnRzLk5PT1AsZ290b1BhZ2U6ZS5jb25zdGFudHMuTk9PUCxuZXh0UGFnZTplLmNvbnN0YW50cy5OT09QLHByZXZQYWdlOmUuY29uc3RhbnRzLk5PT1B9LAoiZGVmYXVsdCI6ZS5jYXBhYmlsaXRpZXMubW9iaWxlfHxlLmNhcGFiaWxpdGllcy50YWJsZXQ/InN0YW5kYXJkTW9iaWxlIjoic3RhbmRhcmREZXNrdG9wIn19KTsidXNlIHN0cmljdCI7bi53aGVuKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtZGlzcGxheSIsImEtY2Fyb3VzZWwtc3RyYXRlZ2llcy10cmFuc2l0aW9uIiwiYS1jYXJvdXNlbC1zdHJhdGVnaWVzLWFqYXgiLCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMtYWNjZXNzaWJpbGl0eSIpLnJlZ2lzdGVyKCJhLWNhcm91c2VsLXN0cmF0ZWdpZXMiLGZ1bmN0aW9uKGUsZyxrLGYpe3JldHVybntkaXNwbGF5OmUsdHJhbnNpdGlvbjpnLGFqYXg6ayxhY2Nlc3NpYmlsaXR5OmZ9fSk7InVzZSBzdHJpY3QiO24ud2hlbigiQSIsImpRdWVyeSIsImEtdGltaW5nLWFuYWx5dGljcyIsImEtY2Fyb3VzZWwtY2xhc3NlcyIsImEtY2Fyb3VzZWwtc3RyYXRlZ2llcyIsImEtY2Fyb3VzZWwtY29uc3RhbnRzIikucmVnaXN0ZXIoImEtY2Fyb3VzZWwtZnJhbWV3b3JrIiwKZnVuY3Rpb24oZSxnLGssZixkLGgpe2Z1bmN0aW9uIGwoYSxjLGQsZil7Yz1uZXcgYyhhLGQsZik7Yy5fX2lkPSsrQzthLmRhdGEoImEtY2Fyb3VzZWwiLGMpO2EucmVtb3ZlQ2xhc3MoImEtY2Fyb3VzZWwtc3RhdGljIik7cChhKT9lLmRlbGF5KGIsMTAsYyk6dC5wdXNoKGMpO2YubmFtZSYmKHdbZi5uYW1lXT1jKTtyZXR1cm4gY31mdW5jdGlvbiBiKGEpe2EuaW5pdCgpO3IucHVzaChhKTthLl9faW5pdGlhbGl6ZWQ9ITA7YS5kb20uJGNvbnRhaW5lci5hZGRDbGFzcygiYS1jYXJvdXNlbC1pbml0aWFsaXplZCIpO3ZhciBiPWEuZ2V0QXR0cigibmFtZSIpO2ImJnlbYl0mJmUuZWFjaCh5W2JdLGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiBjKGEsYil7KGI9YlthKyJTdHJhdGVneSJdKXx8KGI9ZFthXVsiZGVmYXVsdCJdKTtyZXR1cm4gZFthXVtiXX1mdW5jdGlvbiBhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aCxjO2ItLTspYz1hW2JdLGMuZG9tLiRjb250YWluZXIubGVuZ3RoJiZ6LmZpbmQoYy5kb20uJGNvbnRhaW5lcikubGVuZ3RofHwKKChjPWMuZ2V0QXR0cigibmFtZSIpKSYmZGVsZXRlIHdbY10sYS5zcGxpY2UoYiwxKSl9ZnVuY3Rpb24gcSgpe2EodCk7YShyKX1mdW5jdGlvbiB1KGEpe3ZhciBiPWEuZGF0YSgiYS1jYXJvdXNlbC1vcHRpb25zIil8fHt9O2IuZGlzcGxheVN0cmF0ZWd5PWEuZGF0YSgiYS1kaXNwbGF5LXN0cmF0ZWd5Iik7Yi50cmFuc2l0aW9uU3RyYXRlZ3k9YS5kYXRhKCJhLXRyYW5zaXRpb24tc3RyYXRlZ3kiKTtiLmFqYXhTdHJhdGVneT1hLmRhdGEoImEtYWpheC1zdHJhdGVneSIpO2IuYWNjZXNzaWJpbGl0eVN0cmF0ZWd5PWEuZGF0YSgiYS1hY2Nlc3NpYmlsaXR5LXN0cmF0ZWd5Iik7Yi5jYXJvdXNlbENsYXNzPWEuZGF0YSgiYS1jbGFzcyIpO2E9YygiZGlzcGxheSIsYik7dmFyIGQ9YygidHJhbnNpdGlvbiIsYiksZT1jKCJhamF4IixiKSxnPWMoImFjY2Vzc2liaWxpdHkiLGIpLGg9Yi5jYXJvdXNlbENsYXNzO2h8fChoPWZbImRlZmF1bHQiXSk7aD1mW2hdO2lmKGghPT12JiZhIT09diYmCmQhPT12JiZlIT09diYmZyE9PXYpcmV0dXJue2Nhcm91c2VsQ2xhc3M6aCxzdHJhdGVnaWVzOntkaXNwbGF5OmEsdHJhbnNpdGlvbjpkLGFqYXg6ZSxhY2Nlc3NpYmlsaXR5Omd9LG9wdHM6Yn19ZnVuY3Rpb24gcChhKXtyZXR1cm4gYS5oYXNDbGFzcygiYS1iZWdpbiIpJiYwPT09YS5jaGlsZHJlbigiLmEtZW5kIikubGVuZ3RoPyExOmUub25TY3JlZW4oYSl9ZnVuY3Rpb24gbSgpe2coIi5hLWNhcm91c2VsLXN0YXRpYyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYT1nKHRoaXMpLGI9dShhKTtiJiZsKGEsYi5jYXJvdXNlbENsYXNzLGIuc3RyYXRlZ2llcyxiLm9wdHMpfSl9ZnVuY3Rpb24gQSgpe2Zvcih2YXIgYT10Lmxlbmd0aDthLS07KXt2YXIgYz10W2FdO3AoYy5kb20uJGNvbnRhaW5lcikmJih0LnNwbGljZShhLDEpLGIoYykpfX12YXIgdixyPVtdLHQ9W10seD0hMSx3PXt9LHo9Zyhkb2N1bWVudCkseT17fSxDPTA7ZS5vbigicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIixmdW5jdGlvbihhLApiKXtxKCk7KGIuaGVpZ2h0fHxiLndpZHRoKSYmZS5kZWxheShmdW5jdGlvbigpe2UuZWFjaChyLGZ1bmN0aW9uKGEpe2EucmVzaXplKCl9KX0sZS5jYXBhYmlsaXRpZXMubW9iaWxlfHxlLmNhcGFiaWxpdGllcy50YWJsZXQ/MTAwOjApfSk7ZS5vbigiYTpwb3BvdmVyOmFmdGVyU2xpZGVPdXQiLGZ1bmN0aW9uKCl7ZS5lYWNoKHIsZnVuY3Rpb24oYSl7YS5yZXNpemUoKX0pfSk7ZS5vbigiYTpjYXJvdXNlbDpjaGFuZ2U6bmFtZSIsZnVuY3Rpb24oYSl7YS5uZXdWYWx1ZSYmKHdbYS5uZXdWYWx1ZV09YS5jYXJvdXNlbCk7YS5vbGRWYWx1ZSYmZGVsZXRlIHdbYS5vbGRWYWx1ZV19KTtlLm9uKGguSU5JVF9FVkVOVFMsZnVuY3Rpb24oKXtBKCk7bSgpO2Uub25jZShmdW5jdGlvbigpe2suc3RvcFdpZGdldExvZ2dpbmcoImNhcm91c2VsIil9KSgpfSk7ZS5vbigiYTpwYWdlVXBkYXRlIixxKTtlLm9uKCJzY3JvbGwiLGZ1bmN0aW9uKCl7QSgpO20oKX0pO2UuZGVjbGFyYXRpdmUoImEtdGFicyIsCiJjbGljayIsZnVuY3Rpb24oYSl7ZS5kZWxheShmdW5jdGlvbigpe0EoKTtlLmVhY2gocixmdW5jdGlvbihhKXthLmdldEF0dHIoImlzSW5UYWIiKSYmYS5yZXNpemUoKX0pfSw1MCl9KTtlLm9uKCJhOnBvcG92ZXI6YWZ0ZXJTaG93IixmdW5jdGlvbigpe2UuZGVsYXkoQSw1MCl9KTtlLm9uKCJhOnBvcG92ZXI6YWpheENvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7ZS5kZWxheShmdW5jdGlvbigpe3EoKTttKCl9LDUwKX0pO2Uub24ucmVhZHkoZnVuY3Rpb24oKXt4PSEwfSk7aD17Z2V0Q2Fyb3VzZWw6ZnVuY3Rpb24oYSl7YS5qcXVlcnl8fChhPWcoYSkpO3ZhciBiPWEuY2xvc2VzdCgiLmEtY2Fyb3VzZWwtY29udGFpbmVyIikuZGF0YSgiYS1jYXJvdXNlbCIpO2lmKCFiKXt2YXIgYz11KGEpO2MmJihiPWwoYSxjLmNhcm91c2VsQ2xhc3MsYy5zdHJhdGVnaWVzLGMub3B0cykpfXJldHVybiBifSxnZXRDYXJvdXNlbEJ5TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gd1thXX0sY3JlYXRlQWxsOmZ1bmN0aW9uKCl7cSgpOwptKCl9LGluaXRpYWxpemVBbGw6ZnVuY3Rpb24oKXtxKCk7QSgpfSxraWxsOmZ1bmN0aW9uKGEpe2EuanF1ZXJ5fHwoYT1nKGEpKTtpZihhLmxlbmd0aCYmKGE9YS5jbG9zZXN0KCIuYS1jYXJvdXNlbC1jb250YWluZXIiKSxhLmxlbmd0aCkpe3ZhciBiPWEuZGF0YSgiYS1jYXJvdXNlbCIpO2lmKGIpe3ZhciBjPWUuaW5kZXhPZkFycmF5KHIsYik7LTE8Yz8ocltjXS5uYW1lJiZkZWxldGUgd1tyW2NdLm5hbWVdLHIuc3BsaWNlKGMsMSkpOihjPWUuaW5kZXhPZkFycmF5KHQsYiksLTE8YyYmKHRbY10ubmFtZSYmZGVsZXRlIHdbdFtjXS5uYW1lXSx0LnNwbGljZShjLDEpKSl9YS5yZW1vdmUoKX19LHJlZ2lzdGVyU3RyYXRlZ3k6ZnVuY3Rpb24oYSxiLGMpe2RbYV18fChkLnR5cGU9e30pO2RbYV1bYl0mJm4uZXJyb3IoIkF0dGVtcHRlZCB0byByZWdpc3RlciBhICIrYSsiIHN0cmF0ZWd5IHdoaWNoIGFscmVhZHkgZXhpc3RzOiAiK2IsImEtY2Fyb3VzZWwtZnJhbWV3b3JrIiwicmVnaXN0ZXJTdHJhdGVneSIpOwpkW2FdW2JdPWM7eCYmbSgpfSxyZWdpc3RlckNhcm91c2VsQ2xhc3M6ZnVuY3Rpb24oYSxiKXtmW2FdJiZuLmVycm9yKCJBdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgYSBjYXJvdXNlbCBjbGFzcyB3aGljaCBhbHJlYWR5IGV4aXN0czogIithLCJhLWNhcm91c2VsLWZyYW1ld29yayIsInJlZ2lzdGVyQ2Fyb3VzZWxDbGFzcyIpO2cuaXNGdW5jdGlvbihiKXx8bi5lcnJvcigiQXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGNhcm91c2VsIGNsYXNzICIrYSsiIHdpdGhvdXQgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4iLCJhLWNhcm91c2VsLWZyYW1ld29yayIsInJlZ2lzdGVyQ2Fyb3VzZWxDbGFzcyIpO2ZbYV09Yjt4JiZtKCl9LGdldEFsbENhcm91c2VsczpmdW5jdGlvbigpe3JldHVybiByLmNvbmNhdCh0KX0sb25Jbml0OmZ1bmN0aW9uKGEsYil7YSYmKHlbYV18fCh5W2FdPVtdKSxnLmlzRnVuY3Rpb24oYikmJih5W2FdLnB1c2goYiksKGE9d1thXSkmJmEuX19pbml0aWFsaXplZCYmYihhKSkpfX07Ck9iamVjdC5mcmVlemUhPT12JiZPYmplY3QuZnJlZXplKGgpO3JldHVybiBofSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGUpe3ZhciBoPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsbD1oLl9uYW1lc3BhY2V8fGguYXR0cmlidXRlRXJyb3JzLGI9bD9sKCJBbWF6b25VSUNvbXBvbmVudHMiLCJBbWF6b25VSSIpOmg7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChlKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7ZShiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGUsaCxsKXtlLndoZW4oIkEiLCJhLWZvcm0tY29udHJvbHMtYXBpIikucmVnaXN0ZXIoImEtZm9ybS1jb250cm9scy1oYW5kbGVycyIsZnVuY3Rpb24oYixjKXt2YXIgZD1iLiQsYT1mdW5jdGlvbigpe2QodGhpcykucmVtb3ZlQ2xhc3MoImEtaG92ZXItZGlzYWJsZSIpfSxrPWZ1bmN0aW9uKG0sYSl7dmFyIGs9Yy5maW5kRm9ybUVsZW1lbnRDb250YWluZXIobSk7Yi5kZWxheShmdW5jdGlvbigpe2suZmluZChhKS5lYWNoKGMubm9ybWFsaXplRWxlbWVudCl9LDApfTtyZXR1cm57aGFuZGxlQm94SW5wdXRNb2JpbGVGb2N1czpmdW5jdGlvbigpe2QodGhpcykuYWRkQ2xhc3MoImEtZm9ybS1mb2N1cyIpfSwKaGFuZGxlQm94SW5wdXRNb2JpbGVCbHVyOmZ1bmN0aW9uKCl7ZCh0aGlzKS5yZW1vdmVDbGFzcygiYS1mb3JtLWZvY3VzIil9LGFjY2Vzc2liaWxpdHlLZXlQcmVzczpmdW5jdGlvbihhKXthLmtleUNvZGU9PT1iLmNvbnN0YW50cy5rZXljb2Rlcy5TUEFDRSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKX0sZm9ybVJlc2V0OmssaGFuZGxlQ2hlY2tib3hDbGljazpmdW5jdGlvbigpe2lmKCFiLmNhcGFiaWxpdGllcy5tb2JpbGUmJiFiLmNhcGFiaWxpdGllcy50YWJsZXQpZCh0aGlzKS5hZGRDbGFzcygiYS1ob3Zlci1kaXNhYmxlIikub25lKCJtb3VzZWxlYXZlIixhKX0sbm9ybWFsaXplRm9ybUNvbnRyb2xzOmZ1bmN0aW9uKCl7ZCgiZm9ybSIpLnVuYmluZCgicmVzZXQuYS1mb3JtLWNvbnRyb2xzLXJlc2V0IikuYmluZCgicmVzZXQuYS1mb3JtLWNvbnRyb2xzLXJlc2V0IixmdW5jdGlvbihhKXtrKGEuY3VycmVudFRhcmdldCwibGkgLmEtdG91Y2gtbXVsdGktc2VsZWN0Iil9KX0sCnRvdWNoTXVsdGlTZWxlY3RIYW5kbGVyOmZ1bmN0aW9uKGEpe2MudG9nZ2xlQ2hlY2tib3hTdGF0ZShhLmN1cnJlbnRUYXJnZXQpfX19KTsidXNlIHN0cmljdCI7ZS53aGVuKCJBIiwiYS1mb3JtLWNvbnRyb2xzLWhhbmRsZXJzIiwicmVhZHkiKS5yZWdpc3RlcigiYS1mb3JtLWNvbnRyb2xzIixmdW5jdGlvbihiLGMpe3ZhciBkPWIuJDtkKGRvY3VtZW50KS5kZWxlZ2F0ZSgiLmEtY2hlY2tib3gtZmFuY3kiLCJjbGljayIsYy5oYW5kbGVDaGVja2JveENsaWNrKS5kZWxlZ2F0ZSgiLmEtY2hlY2tib3gtZmFuY3ksIC5hLXJhZGlvLWZhbmN5Iiwia2V5cHJlc3MiLGMuYWNjZXNzaWJpbGl0eUtleVByZXNzKTtiLm9uKCJhOnBhZ2VVcGRhdGUgYmVmb3JlUmVhZHkiLGMubm9ybWFsaXplRm9ybUNvbnRyb2xzKX0pOyJ1c2Ugc3RyaWN0IjtlLndoZW4oIkEiKS5yZWdpc3RlcigiYS1idXR0b25zIixmdW5jdGlvbihiKXt2YXIgYz1iLiQsZD0wO2IuZGVjbGFyYXRpdmUoImEtYnV0dG9uLWdyb3VwIiwKWyJjbGljayJdLGZ1bmN0aW9uKGEpe3ZhciBjPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1idXR0b246bm90KC5hLWJ1dHRvbi1kaXNhYmxlZCkiKTtpZihjLmxlbmd0aCl7dmFyIG09YS4kZGVjbGFyYXRpdmVQYXJlbnQuZmluZCgiLmEtYnV0dG9uIiksZj1hLmRhdGEmJmEuZGF0YS5uYW1lP2EuZGF0YS5uYW1lOiExO2E9YS4kdGFyZ2V0LmNsb3Nlc3QoImlucHV0W3R5cGVceDNkc3VibWl0XSwgYnV0dG9uIikuYXR0cigibmFtZSIpO20ucmVtb3ZlQ2xhc3MoImEtYnV0dG9uLXNlbGVjdGVkIikuYXR0cigiYXJpYS1jaGVja2VkIiwiZmFsc2UiKTtjLmFkZENsYXNzKCJhLWJ1dHRvbi1zZWxlY3RlZCIpLmF0dHIoImFyaWEtY2hlY2tlZCIsInRydWUiKTtpZihhfHxmKWM9eyRidXR0b246YyxidXR0b25OYW1lOmEsYnV0dG9uR3JvdXBOYW1lOmZ9LGYmJihiLnRyaWdnZXIoImE6YnV0dG9uLWdyb3VwOiIrZisiOnRvZ2dsZSIse3NlbGVjdGVkQnV0dG9uOmN9KSxhJiZiLnRyaWdnZXIoImE6YnV0dG9uLWdyb3VwOiIrCmYrIjoiK2ErIjp0b2dnbGUiLHtzZWxlY3RlZEJ1dHRvbjpjfSkpfX0pO2Iub24oImE6cGFnZVVwZGF0ZSBiZWZvcmVSZWFkeSIsZnVuY3Rpb24oKXt2YXIgYT1jKCIuYS1idXR0b246bm90KFtpZF0pIiksYj1jKCIuYS1idXR0b24tZ3JvdXAsLmEtYnV0dG9uLXRvZ2dsZS1ncm91cCIpO2EuZWFjaChmdW5jdGlvbigpe3ZhciBhPWModGhpcyksYj1hLmZpbmQoIi5hLWJ1dHRvbi10ZXh0IiksZT1hLmZpbmQoIi5hLWJ1dHRvbi1pbnB1dCIpLGc9ImEtYXV0b2lkLSIrZCsrO2EuYXR0cigiaWQiLGcpO2IubGVuZ3RoJiYoZz0oYT1iLmF0dHIoImlkIikpP2E6ZysiLWFubm91bmNlIixlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIsZyksYi5hdHRyKCJpZCIsZykpfSk7Yi5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9Yyh0aGlzKS5maW5kKCIuYS1idXR0b25bcm9sZVx4M2QncmFkaW8nXSIpLGI9YS5sZW5ndGgsZD0xO2EuZWFjaChmdW5jdGlvbigpe2ModGhpcykuYXR0cih7ImFyaWEtcG9zaW5zZXQiOmQrKywKImFyaWEtc2V0c2l6ZSI6Yn0pfSl9KX0pO2MoZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1idXR0b24taW5wdXQsIC5hLWJ1dHRvbi10ZXh0IiwiZm9jdXNpbiIsZnVuY3Rpb24oKXt2YXIgYT1jKHRoaXMpLmNsb3Nlc3QoIi5hLWJ1dHRvbiIpO2EuaGFzQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIil8fGEuYWRkQ2xhc3MoImEtYnV0dG9uLWZvY3VzIil9KS5kZWxlZ2F0ZSgiLmEtYnV0dG9uLWlucHV0LCAuYS1idXR0b24tdGV4dCIsImZvY3Vzb3V0ICIrYi5hY3Rpb24uY2FuY2VsLGZ1bmN0aW9uKCl7Yyh0aGlzKS5jbG9zZXN0KCIuYS1idXR0b24iKS5yZW1vdmVDbGFzcygiYS1idXR0b24tZm9jdXMiKX0pfSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGUpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBbWF6b25VSVRhYnMiLCJBbWF6b25VSSIpOmI7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChlKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7ZShhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGUsYixkKXtlLndoZW4oIkEiKS5yZWdpc3RlcigiYS10YWJzIixmdW5jdGlvbihhKXt2YXIgZT1hLiQ7YS5kZWNsYXJhdGl2ZSgiYS10YWJzIixbImNsaWNrIl0sZnVuY3Rpb24oYil7dmFyIGM9Yi4kdGFyZ2V0LmNsb3Nlc3QoImxpIiksZD1iLmRhdGEubmFtZSxmPWMuZGF0YSgiYS10YWItbmFtZSIpLGc9Yy5jbG9zZXN0KCIuYS10YWItY29udGFpbmVyIikuZmluZCgiLmEtYm94LXRhYiIpO2YmJihlKCJsaS5hLWFjdGl2ZSIsYy5jbG9zZXN0KCIuYS10YWJzIikpLnJlbW92ZUNsYXNzKCJhLWFjdGl2ZSIpLGMuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygiYS1hY3RpdmUiKSwKZy5hZGRDbGFzcygiYS1oaWRkZW4iKSxnLmZpbHRlcignW2RhdGEtYS1uYW1lXHgzZCInK2YrJyJdJykucmVtb3ZlQ2xhc3MoImEtaGlkZGVuIiksYz17JHRhYjpjLHRhYk5hbWU6Zix0YWJTZXROYW1lOmR9LGEudHJpZ2dlcigiYTp0YWJzOiIrZCsiOnNlbGVjdCIse3NlbGVjdGVkVGFiOmN9KSxhLnRyaWdnZXIoImE6dGFiczoiK2QrIjoiK2YrIjpzZWxlY3QiLHtzZWxlY3RlZFRhYjpjfSksYi4kZXZlbnQucHJldmVudERlZmF1bHQoKSl9KX0pfSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihjKXt2YXIgZz13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLGY9Zy5fbmFtZXNwYWNlfHxnLmF0dHJpYnV0ZUVycm9ycyxhPWY/ZigiQW1hem9uVUlBY2NvcmRpb24iLCJBbWF6b25VSSIpOmc7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChjKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7YyhhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsZyxmKXtjLndoZW4oIkEiKS5yZWdpc3RlcigiYS1hY2NvcmRpb24tYTExeSIsZnVuY3Rpb24oYSl7dmFyIGM9YS4kLGQ7cmV0dXJue3JlZnJlc2hGb2N1czpmdW5jdGlvbihoLGUpe2U9ZXx8NjAwO2R8fChkPWMoIlx4M2NiIC9ceDNlIix7ImNsYXNzIjoiYS1hY2NvcmRpb24tYTExeSIsdGFiSW5kZXg6LTEsc3R5bGU6InBvc2l0aW9uOiBhYnNvbHV0ZSJ9KS5hcHBlbmRUbygiYm9keSIpKTtkLmNzcyh7ZGlzcGxheToiYmxvY2sifSkub2Zmc2V0KGgub2Zmc2V0KCkpO2EuZGVsYXkoZnVuY3Rpb24oKXtkLmZvY3VzKCl9LAo1MCk7YS5kZWxheShmdW5jdGlvbigpe2guZm9jdXMoKTtkLmNzcyh7ZGlzcGxheToibm9uZSJ9KX0sZSl9fX0pO2Mud2hlbigiQSIsImEtYWNjb3JkaW9uLWExMXkiKS5yZWdpc3RlcigiYS1hY2NvcmRpb24iLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9InNsaWRlRG93biIsaD0ic2xpZGVVcCIsZT0zMDA7aWYoYS5jYXBhYmlsaXRpZXMubW9iaWxlfHxhLmNhcGFiaWxpdGllcy50YWJsZXQpZD0ic2hvdyIsaD0iaGlkZSIsZT0wO3ZhciBnPSFhLmNhcGFiaWxpdGllcy50b3VjaCYmYS5jYXBhYmlsaXRpZXMuaXNGaXJlZm94O2EuZGVjbGFyYXRpdmUoImEtYWNjb3JkaW9uIixbImNsaWNrIl0sZnVuY3Rpb24obSl7dmFyIGs9bS4kdGFyZ2V0LmNsb3Nlc3QoIi5hLWFjY29yZGlvbiIpLGI9bS4kdGFyZ2V0LmNsb3Nlc3QoIi5hLWJveCIpLGY9ay5maW5kKCIuYS1ib3giKS5ub3QoYiksbD1iLmZpbmQoIi5hLWFjY29yZGlvbi1yb3ciKSxuPWsuZGF0YSgiYS1hY2NvcmRpb24tbmFtZSIpLHA9Yi5kYXRhKCJhLWFjY29yZGlvbi1yb3ctbmFtZSIpLAp1PWsuaGFzQ2xhc3MoImEtYWNjb3JkaW9uLWNvbGxhcHNlIikscT1tLiR0YXJnZXQuY2xvc2VzdCgiLmEtYWNjb3JkaW9uLXJvdy1hMTF5Iiksaz1rLmZpbmQoIi5hLWFjY29yZGlvbi1yb3ctYTExeSIpLm5vdChxKTtpZihwKXt2YXIgdD1iLmZpbmQoIi5hLWFjY29yZGlvbi1pbm5lciIpLHI9ITA7aWYoYi5oYXNDbGFzcygiYS1hY2NvcmRpb24tYWN0aXZlIikpaWYodSl0W2hdKHtkdXJhdGlvbjplLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVDbGFzcygiYS1hY2NvcmRpb24tYWN0aXZlIik7Yi5maW5kKCIuYS1pY29uLmEtYWNjb3JkaW9uLXJhZGlvIikucmVtb3ZlQ2xhc3MoImEtaWNvbi1yYWRpby1hY3RpdmUiKS5hZGRDbGFzcygiYS1pY29uLXJhZGlvLWluYWN0aXZlIik7cS5hdHRyKCJhcmlhLWNoZWNrZWQiLCJmYWxzZSIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpfX0pO2Vsc2Ugcj0hMTtlbHNlIGYuZmluZCgiLmEtYWNjb3JkaW9uLWlubmVyIilbaF0oe2R1cmF0aW9uOmUsCmNvbXBsZXRlOmZ1bmN0aW9uKCl7Zi5yZW1vdmVDbGFzcygiYS1hY2NvcmRpb24tYWN0aXZlIil9fSksdFtkXSh7ZHVyYXRpb246ZSxjb21wbGV0ZTpmdW5jdGlvbigpe2IuYWRkQ2xhc3MoImEtYWNjb3JkaW9uLWFjdGl2ZSIpO2YuZmluZCgiLmEtaWNvbi5hLWFjY29yZGlvbi1yYWRpbyIpLnJlbW92ZUNsYXNzKCJhLWljb24tcmFkaW8tYWN0aXZlIikuYWRkQ2xhc3MoImEtaWNvbi1yYWRpby1pbmFjdGl2ZSIpO2IuZmluZCgiLmEtaWNvbi5hLWFjY29yZGlvbi1yYWRpbyIpLnJlbW92ZUNsYXNzKCJhLWljb24tcmFkaW8taW5hY3RpdmUiKS5hZGRDbGFzcygiYS1pY29uLXJhZGlvLWFjdGl2ZSIpfX0pLGsuYXR0cigiYXJpYS1jaGVja2VkIiwiZmFsc2UiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxxLmF0dHIoImFyaWEtY2hlY2tlZCIsInRydWUiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpO3ImJmcmJmMucmVmcmVzaEZvY3VzKGwpO3ImJihsPXskcm93OmIscm93TmFtZTpwLAphY2NvcmRpb25OYW1lOm59LGEudHJpZ2dlcigiYTphY2NvcmRpb246c2VsZWN0Iix7c2VsZWN0ZWRSb3c6bH0pLGEudHJpZ2dlcigiYTphY2NvcmRpb246IituKyI6c2VsZWN0Iix7c2VsZWN0ZWRSb3c6bH0pLGEudHJpZ2dlcigiYTphY2NvcmRpb246IituKyI6IitwKyI6c2VsZWN0Iix7c2VsZWN0ZWRSb3c6bH0pKX1tLiRldmVudC5wcmV2ZW50RGVmYXVsdCgpfSl9KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24oZSl7dmFyIGw9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxmPWwuX25hbWVzcGFjZXx8bC5hdHRyaWJ1dGVFcnJvcnMsYj1mP2YoIkFtYXpvblVJRXhwYW5kZXIiLCJBbWF6b25VSSIpOmw7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChlKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7ZShiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGUsbCxmKXtlLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1leHBhbmRlciIsZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBsKGEsbSl7dmFyIGI9YS5jbG9zZXN0KCIuIitjLmNvbnRhaW5lciksZz1iLmRhdGEoImEtZXhwYW5kZXItY29sbGFwc2VkLWhlaWdodCIpLGQ9InRydWUiPT09YS5hdHRyKCJhcmlhLWV4cGFuZGVkIik7YS50b2dnbGVDbGFzcyhjLmNvbnRlbnQrIi1leHBhbmRlZCIpO2c/KGIuY3NzKCJoZWlnaHQiLGQ/ZzoiYXV0byIpLGEuYXR0cigiYXJpYS1leHBhbmRlZCIsZD8iZmFsc2UiOiJ0cnVlIiksCm0oKSk6YS50b2dnbGUoMCxmdW5jdGlvbigpe2EuYXR0cigiYXJpYS1leHBhbmRlZCIsZD8iZmFsc2UiOiJ0cnVlIik7bSgpfSl9ZnVuY3Rpb24gZigpe2UoIi5hLWV4cGFuZGVyLXBhcnRpYWwtY29sbGFwc2UtY29udGFpbmVyIikuZWFjaChmdW5jdGlvbigpe3ZhciBhPWUodGhpcyksYj1hLmNoaWxkcmVuKCIuIitjLmNvbnRlbnQpLGQ9YS5kYXRhKCJhLWV4cGFuZGVyLWNvbGxhcHNlZC1oZWlnaHQiKSxnPWEuY2hpbGRyZW4oIi4iK2MuaGVhZGVyKTtiLmhlaWdodCgpPD1kP2cuY3NzKHtvcGFjaXR5OiIwIixkaXNwbGF5OiJub25lIn0pOihnLmNzcyh7b3BhY2l0eToiMSIsZGlzcGxheToiYmxvY2sifSksYi5jc3MoInBhZGRpbmctYm90dG9tIixnLmhlaWdodCgpKSwidHJ1ZSIhPT1iLmF0dHIoImFyaWEtZXhwYW5kZWQiKSYmYS5jc3Moe2hlaWdodDpkLCJtYXgtaGVpZ2h0Ijoibm9uZSJ9KSl9KX12YXIgbj17aW5saW5lOntleHBhbmQ6ImEtaWNvbi1leHBhbmQiLGNvbGxhcHNlOiJhLWljb24tY29sbGFwc2UifSwKc2VjdGlvbjp7ZXhwYW5kOiJhLWljb24tc2VjdGlvbi1leHBhbmQiLGNvbGxhcHNlOiJhLWljb24tc2VjdGlvbi1jb2xsYXBzZSJ9LGV4dGVuZGVyOntleHBhbmQ6ImEtaWNvbi1leHRlbmRlci1leHBhbmQiLGNvbGxhcHNlOiJhLWljb24tZXh0ZW5kZXItY29sbGFwc2UifX0sYz17Y29udGFpbmVyOiJhLWV4cGFuZGVyLWNvbnRhaW5lciIsY29udGVudDoiYS1leHBhbmRlci1jb250ZW50IixoZWFkZXI6ImEtZXhwYW5kZXItaGVhZGVyIixmYWRlRGl2OiJhLWV4cGFuZGVyLWNvbnRlbnQtZmFkZSJ9LGQ9e307Yi5lYWNoKG4sZnVuY3Rpb24oYSxjKXtkW2NdPXt9O2IuZWFjaChhLGZ1bmN0aW9uKGEsYil7ZFtjXVtiXT1uZXcgUmVnRXhwKCJcXGIiK2ErIlxcYiIsImciKX0pfSk7Yi5kZWNsYXJhdGl2ZSgiYS1leHBhbmRlci10b2dnbGUiLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIG09YS4kdGFyZ2V0LmNsb3Nlc3QoIi4iK2MuY29udGFpbmVyKSxlPW0uZmluZCgiLiIrYy5jb250YWluZXIpLApnPW0uZGF0YSgiYS1leHBhbmRlci1uYW1lIiksZjtmPWEuJGN1cnJlbnRUYXJnZXQuaGFzQ2xhc3MoYy5oZWFkZXIpP2EuJGN1cnJlbnRUYXJnZXQ6bS5maW5kKCIuIitjLmhlYWRlcikubm90KGUuZmluZCgiLiIrYy5oZWFkZXIpKTt2YXIgcD1tLmZpbmQoIi4iK2MuY29udGVudCkubm90KGUuZmluZCgiLiIrYy5jb250ZW50KSk7bChwLGZ1bmN0aW9uKCl7dmFyIGg9Zi5maW5kKCIuYS1pY29uIilbMF0saz1udWxsLGw9Zi5jaGlsZHJlbigiLiIrYy5mYWRlRGl2KTsiZmFsc2UiPT09cC5hdHRyKCJhcmlhLWV4cGFuZGVkIik/KGgmJihoLmNsYXNzTmFtZT1oLmNsYXNzTmFtZS5yZXBsYWNlKGQuaW5saW5lLmNvbGxhcHNlLG4uaW5saW5lLmV4cGFuZCkucmVwbGFjZShkLnNlY3Rpb24uY29sbGFwc2Usbi5zZWN0aW9uLmV4cGFuZCkucmVwbGFjZShkLmV4dGVuZGVyLmNvbGxhcHNlLG4uZXh0ZW5kZXIuZXhwYW5kKSksYS5kYXRhJiZhLmRhdGEuZXhwYW5kX3Byb21wdCYmKGs9YS5kYXRhLmV4cGFuZF9wcm9tcHQpLApsLnNob3coKSxoPSJjb2xsYXBzZSIpOihoJiYoaC5jbGFzc05hbWU9aC5jbGFzc05hbWUucmVwbGFjZShkLmlubGluZS5leHBhbmQsbi5pbmxpbmUuY29sbGFwc2UpLnJlcGxhY2UoZC5zZWN0aW9uLmV4cGFuZCxuLnNlY3Rpb24uY29sbGFwc2UpLnJlcGxhY2UoZC5leHRlbmRlci5leHBhbmQsbi5leHRlbmRlci5jb2xsYXBzZSkpLGEuZGF0YSYmYS5kYXRhLmNvbGxhcHNlX3Byb21wdCYmKGs9YS5kYXRhLmNvbGxhcHNlX3Byb21wdCksbC5oaWRlKCksaD0iZXhwYW5kIik7ayYmIiIhPT1rJiZmLmZpbmQoIi5hLWV4cGFuZGVyLXByb21wdCIpLm5vdChlLmZpbmQoIi5hLWV4cGFuZGVyLXByb21wdCIpKS5odG1sKGspO2s9eyRleHBhbmRlcjptLGV4cGFuZGVyTmFtZTpnfTtiLnRyaWdnZXIoImE6ZXhwYW5kZXI6dG9nZ2xlIix7ZXhwYW5kZXI6a30pO2IudHJpZ2dlcigiYTpleHBhbmRlcjp0b2dnbGU6IitoLHtleHBhbmRlcjprfSk7ZyYmKGIudHJpZ2dlcigiYTpleHBhbmRlcjoiK2crCiI6dG9nZ2xlIix7ZXhwYW5kZXI6a30pLGIudHJpZ2dlcigiYTpleHBhbmRlcjoiK2crIjp0b2dnbGU6IitoLHtleHBhbmRlcjprfSkpfSl9KTtiLm9uKCJsb2FkIHJlYWR5IHJlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZSBhOnBvcG92ZXI6YWZ0ZXJTaG93IGE6cG9wb3ZlcjphamF4Q29udGVudExvYWRlZCIsZik7cmV0dXJue2luaXRpYWxpemVFeHBhbmRlcnM6Zn19KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24oaCl7dmFyIGU9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxuPWUuX25hbWVzcGFjZXx8ZS5hdHRyaWJ1dGVFcnJvcnMsZD1uP24oIkFtYXpvblVJU3dpdGNoIiwiQW1hem9uVUkiKTplO2QuZ3VhcmRGYXRhbD9kLmd1YXJkRmF0YWwoaCkoZCx3aW5kb3cpOmQuZXhlY3V0ZShmdW5jdGlvbigpe2goZCx3aW5kb3cpfSl9KShmdW5jdGlvbihoLGUsbil7aC53aGVuKCJhLXN3aXRjaC1mcmFtZXdvcmsiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1zd2l0Y2giLGZ1bmN0aW9uKGQsZyl7dmFyIGw9ZC5TV0lUQ0hfU1RBVEUsaD1kLlNXSVRDSF9DT05UQUlORVJfQ0xBU1MscD1kLlNXSVRDSF9DTEFTUztyZXR1cm57Z2V0U3dpdGNoOmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGsoYyl7dmFyIG09Zi5kYXRhKGwpO2lmKHZvaWQgMD09PWMpcmV0dXJuIG0uaXNPbjtpZighbS5pc0VuYWJsZWR8fGUoZikpcmV0dXJuITE7ZC5zZXRPblN0YXRlKGYsYyk7cmV0dXJuITB9ZnVuY3Rpb24gZSgpe3JldHVybiBmLmRhdGEobCkuaXNEcmFnZ2luZ30KYy5qcXVlcnl8fChjPWcoYykpO2lmKDA9PT1jLmxlbmd0aClyZXR1cm4gbnVsbDtjPWMuZXEoMCk7Yz1jLmNsb3Nlc3QoIi4iK2gpO2lmKDA9PT1jLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgZj1jLmZpbmQoIi4iK3ApO2QuZW5zdXJlSW5pdGlhbGl6ZWQoZik7cmV0dXJue3RvZ2dsZTpmdW5jdGlvbigpe3JldHVybiBrKCFmLmRhdGEobCkuaXNPbil9LGlzT246ayxlbmFibGVkOmZ1bmN0aW9uKGMpe3ZhciBtPWYuZGF0YShsKTtpZih2b2lkIDA9PT1jKXJldHVybiBtLmlzRW5hYmxlZDtpZihtLmlzRW5hYmxlZD09PWMpcmV0dXJuITE7ZC5zZXRFbmFibGVkKGYsYyk7cmV0dXJuITB9LGlzRHJhZ2dpbmc6ZSxsYWJlbDpmdW5jdGlvbihkKXt2YXIgYz1mLmRhdGEobCkubGFiZWwsaD1jWzBdLmNoaWxkTm9kZXNbMF07aWYodm9pZCAwPT09ZClyZXR1cm4gYy50ZXh0KCk7Mz09PWgubm9kZVR5cGUmJihoLnRleHRDb250ZW50PWQpfX19fX0pOyJ1c2Ugc3RyaWN0IjtoLndoZW4oIkEiLCJqUXVlcnkiKS5yZWdpc3RlcigiYS1zd2l0Y2gtZnJhbWV3b3JrIiwKZnVuY3Rpb24oZCxnKXtmdW5jdGlvbiBsKGEpe2EucHJldmVudERlZmF1bHQoKTt2YXIgYj1hLmRhdGEuJHN3aXRjaC5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpLGM9Yi5jb250cm9sO2lmKCFkLmlzQW5pbWF0ZWQoYykpe2E9cShhKS1iLmluaXRpYWxYO2IuaXNPbiYmKGErPWIucmlnaHRCb3VuZGFyeSk7dmFyIGU9Yi5sZWZ0Qm91bmRhcnksdj1iLnJpZ2h0Qm91bmRhcnk7YT1hPGU/ZTphPnY/djphO2EhPT1iLmxlZnRPZmZzZXQmJihkLmFuaW1hdGUoYyx7bGVmdDphfSwwKSxiLmxlZnRPZmZzZXQ9YSxiLmlzRHJhZ2dpbmc9ITAsYi5kcmFnQ291bnQrKyl9fWZ1bmN0aW9uIGUoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKGQuY2FwYWJpbGl0aWVzLnRvdWNofHwxPT09YS53aGljaCl7YT1hLmRhdGEuJHN3aXRjaDt2YXIgYj1hLmRhdGEoImEtc3dpdGNoLXN0YXRlIik7ayhhLGIuaXNEcmFnZ2luZyYmMTxiLmRyYWdDb3VudD9iLmxlZnRPZmZzZXQ+Yi5taWRQb2ludDohYi5pc09uKTtiLmlzRHJhZ2dpbmc9CiExO3QoYSl9fWZ1bmN0aW9uIHAoYSxiLGMpe2M9e3N3aXRjaFN0YXRlOmEscHJldmlvdXNTdGF0ZTpjfTtkLnRyaWdnZXIoImE6c3dpdGNoOiIrYixjKTthLm5hbWUmJmQudHJpZ2dlcigiYTpzd2l0Y2g6IithLm5hbWUrIjoiK2IsYyl9ZnVuY3Rpb24gYyhhKXtpZighYS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpKXt2YXIgYj1hLmNsb3Nlc3QoIi5hLXN3aXRjaC1yb3ciKSxjPWEuY2hpbGRyZW4oIi5hLXN3aXRjaC1jb250cm9sIiksZD1iLmZpbmQoIi5hLXN3aXRjaC1sYWJlbCIpLGU9ZC5zaWJsaW5ncygiaW5wdXQiKSxoPWUuYXR0cigibmFtZSIpLGY9Yi5oYXNDbGFzcygiYS1hY3RpdmUiKSxsPSFiLmhhc0NsYXNzKCJhLWRpc2FibGVkIiksZz1yLmxlZnQsaz1hLndpZHRoKCktYy53aWR0aCgpK3IucmlnaHQ7YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIse2lucHV0OmUsY29udGFpbmVyOmIsY29udHJvbDpjLGxhYmVsOmQsaXNEcmFnZ2luZzohMSxyaWdodEJvdW5kYXJ5OmssbGVmdEJvdW5kYXJ5OmcsCm1pZFBvaW50OmsvMixpbml0aWFsWDpudWxsLGxlZnRPZmZzZXQ6Zj9rOmcsbWF4TGVmdE9mZnNldDpyLm1heExlZnRPZmZzZXQsaXNPbjpmLGlzRW5hYmxlZDpsLG5hbWU6aCxkcmFnQ291bnQ6MCxjbGlja2VkOiExfSl9fWZ1bmN0aW9uIGsoYSxiKXtjKGEpO2E9YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpO3ZhciBlPWEuaXNPbixoPWIhPT1hLmlzT247YS5pc09uPWI7dmFyIGY9YS5jb250cm9sLGs9YS5tYXhMZWZ0T2Zmc2V0LGc9YS5pc09uP2EucmlnaHRCb3VuZGFyeTphLmxlZnRCb3VuZGFyeSxnPWsmJmc+az9rOmc7ZC5hbmltYXRlKGYse2xlZnQ6Z30sMzAwLCJlYXNlLW91dCIpO2EubGVmdE9mZnNldD1nO2Y9YS5jb250YWluZXI7YS5pc09uP2YuYWRkQ2xhc3MoImEtYWN0aXZlIik6Zi5yZW1vdmVDbGFzcygiYS1hY3RpdmUiKTtmPWEuaW5wdXQ7YS5pc09uP2YuYXR0cigiY2hlY2tlZCIsImNoZWNrZWQiKTpmLnJlbW92ZUF0dHIoImNoZWNrZWQiKTtoJiZwKGEsImZsaXAiLAplKTtiP3AoYSwib24iLGUpOnAoYSwib2ZmIixlKX12YXIgbj1mdW5jdGlvbihhKXthLmJpbmQoInRvdWNobW92ZS5hLXN3aXRjaC1jb21wb25lbnQiLHskc3dpdGNoOmF9LGwpO2EuYmluZCgidG91Y2hlbmQuYS1zd2l0Y2gtY29tcG9uZW50Iix7JHN3aXRjaDphfSxlKTthLmJpbmQoInRvdWNoY2FuY2VsLmEtc3dpdGNoLWNvbXBvbmVudCIseyRzd2l0Y2g6YX0sZSk7YS5iaW5kKCJtb3VzZXVwLmEtc3dpdGNoLWNvbXBvbmVudCIseyRzd2l0Y2g6YX0sZSl9LGY9ZnVuY3Rpb24oYSl7YS51bmJpbmQoInRvdWNobW92ZS5hLXN3aXRjaC1jb21wb25lbnQiKTthLnVuYmluZCgidG91Y2hlbmQuYS1zd2l0Y2gtY29tcG9uZW50Iik7YS51bmJpbmQoInRvdWNoY2FuY2VsLmEtc3dpdGNoLWNvbXBvbmVudCIpO2EudW5iaW5kKCJtb3VzZXVwLmEtc3dpdGNoLWNvbXBvbmVudCIpfSx3PWZ1bmN0aW9uKGEpe3JldHVybihhLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXXx8YS5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKS5wYWdlWH0sCm09ZnVuY3Rpb24oYSl7ZygiYm9keSIpLmJpbmQoIm1vdXNlbW92ZS5hLXN3aXRjaC1jb21wb25lbnQiLHskc3dpdGNoOmF9LGwpO2coImJvZHkiKS5iaW5kKCJtb3VzZXVwLmEtc3dpdGNoLWNvbXBvbmVudCIseyRzd2l0Y2g6YX0sZSl9LHg9ZnVuY3Rpb24oYSl7ZygiYm9keSIpLnVuYmluZCgibW91c2Vtb3ZlLmEtc3dpdGNoLWNvbXBvbmVudCIsbCk7ZygiYm9keSIpLnVuYmluZCgibW91c2V1cC5hLXN3aXRjaC1jb21wb25lbnQiLGUpfSx5PWZ1bmN0aW9uKGEpe3JldHVybiBhLnBhZ2VYfSxyPXtsZWZ0Oi0xLHJpZ2h0Oi0xfTtoLndoZW4oInBydjpza2luLXZhcnMiKS5leGVjdXRlKGZ1bmN0aW9uKGEpe3I9YS50b2dnbGUuYm91bmRzfSk7dmFyIHU9bnVsbCx0PW51bGwscT1udWxsO2QuY2FwYWJpbGl0aWVzLnRvdWNoPyh1PW4sdD1mLHE9dyk6KHU9bSx0PXgscT15KTtkLmRlY2xhcmF0aXZlKCJhLXN3aXRjaCIsZC5jYXBhYmlsaXRpZXMudG91Y2g/InRvdWNoc3RhcnQiOiJtb3VzZWRvd24iLApmdW5jdGlvbihhKXt2YXIgYj1hLiRldmVudDtiLnByZXZlbnREZWZhdWx0KCk7aWYoZC5jYXBhYmlsaXRpZXMudG91Y2h8fDE9PT1iLndoaWNoKXthPWEuJGRlY2xhcmF0aXZlUGFyZW50O2MoYSk7dmFyIGU9YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpO2UuZHJhZ0NvdW50PTA7ZS5jbGlja2VkPSEwO2UuaXNEcmFnZ2luZz0hMTtlLmlzRW5hYmxlZCYmKGUuaW5pdGlhbFg9cShiKSx1KGEpKX19KTtkLmRlY2xhcmF0aXZlKCJhLXN3aXRjaC1pbnB1dCIsImNoYW5nZSIsZnVuY3Rpb24oYSl7YS4kZXZlbnQucHJldmVudERlZmF1bHQoKTthPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1zd2l0Y2gtcm93IikuZmluZCgiLmEtc3dpdGNoIik7YyhhKTt2YXIgYj1hLmRhdGEoImEtc3dpdGNoLXN0YXRlIik7ayhhLCFiLmlzT24pfSk7ZC5kZWNsYXJhdGl2ZSgiYS1zd2l0Y2gtbGFiZWwiLCJjbGljayIsZnVuY3Rpb24oYSl7YS4kZXZlbnQucHJldmVudERlZmF1bHQoKTthPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1zd2l0Y2gtcm93IikuZmluZCgiLmEtc3dpdGNoIik7CmMoYSk7dmFyIGI9YS5kYXRhKCJhLXN3aXRjaC1zdGF0ZSIpO2IuY2xpY2tlZD9iLmNsaWNrZWQ9ITE6Yi5pc0VuYWJsZWQmJmsoYSwhYi5pc09uKX0pO2gud2hlbigicmVhZHkiKS5leGVjdXRlKCJhLXN3aXRjaC1ub3JtYWxpemF0aW9uIixmdW5jdGlvbigpe2coIi5hLXN3aXRjaC1pbnB1dCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYT1nKHRoaXMpLGI9YS5uZXh0KCkuY2hpbGRyZW4oIi5hLXN3aXRjaCIpO2soYixhLnByb3AoImNoZWNrZWQiKSl9KX0pO3JldHVybntlbnN1cmVJbml0aWFsaXplZDpjLHNldE9uU3RhdGU6ayxzZXRFbmFibGVkOmZ1bmN0aW9uKGEsYil7YyhhKTthPWEuZGF0YSgiYS1zd2l0Y2gtc3RhdGUiKTt2YXIgZD1hLmNvbnRhaW5lcjtiP2QucmVtb3ZlQ2xhc3MoImEtZGlzYWJsZWQiKTpkLmFkZENsYXNzKCJhLWRpc2FibGVkIik7YS5pc0VuYWJsZWQ9Yn0sU1dJVENIX1NUQVRFOiJhLXN3aXRjaC1zdGF0ZSIsU1dJVENIX0NPTlRBSU5FUl9DTEFTUzoiYS1zd2l0Y2gtcm93IiwKU1dJVENIX0NMQVNTOiJhLXN3aXRjaCJ9fSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGIpe3ZhciBhPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZz1hLl9uYW1lc3BhY2V8fGEuYXR0cmlidXRlRXJyb3JzLGU9Zz9nKCJBbWF6b25VSVByb2dyZXNzQmFyIiwiQW1hem9uVUkiKTphO2UuZ3VhcmRGYXRhbD9lLmd1YXJkRmF0YWwoYikoZSx3aW5kb3cpOmUuZXhlY3V0ZShmdW5jdGlvbigpe2IoZSx3aW5kb3cpfSl9KShmdW5jdGlvbihiLGEsZyl7Yi53aGVuKCJBIiwicmVhZHkiKS5yZWdpc3RlcigiYS1wcm9ncmVzcyIsZnVuY3Rpb24oZSl7ZnVuY3Rpb24gYihhKXsoYT9mKGEpOmYoIi5hLWpzLXByb2dyZXNzLWJhciIpKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKTtpZihlLm9uU2NyZWVuKGIsMCkpe3ZhciBhLGgsYyxnO2E9K2IuYXR0cigiZGF0YS1wcm9ncmVzcy1wZXJjZW50YWdlIik7aD0tKGEtMTAwKTtjPWIud2lkdGgoKTtnPWgvMTAwKmM7dmFyIGQ9Yi5maW5kKCIuYS1qcy1wcm9ncmVzcy10b29sdGlwIiksaz1kLndpZHRoKCk7CmQuZmluZCgiLmEtanMtdG9vbHRpcC1hcnJvdyIpO2E9KGEraC8yKS8xMDAqYy1rLzI7aD1rK2E7KGs9aDxjKXx8KGEtPWgtYyk7Yz1hO2YoZCkuY3NzKCJsZWZ0IixjKzApO2M9ZC53aWR0aCgpO2Q9ZC5maW5kKCIuYS1qcy10b29sdGlwLWFycm93Iik7ZC5yZW1vdmVDbGFzcygiYW9rLWhpZGRlbiIpO2s/KGMvPTIsZihkKS5jc3MoImxlZnQiLGMrLTkpKTpmKGQpLmNzcygibGVmdCIsYystMjcpOzEyPmcmJmQuYWRkQ2xhc3MoImFvay1oaWRkZW4iKTtmKGIuZmluZCgiLmEtanMtcHJvZ3Jlc3MtdG9vbHRpcCIpKS5yZW1vdmVDbGFzcygiYS1wcm9ncmVzcy10b29sdGlwLWhpZGRlbiIpLmFkZENsYXNzKCJhLXByb2dyZXNzLXRvb2x0aXAtcmV2ZWFsZWQiKX19KX12YXIgZj1lLiQ7YigpO2Uub24oInJlc2l6ZSBzY3JvbGwiLGZ1bmN0aW9uKGEpe2IoKX0pO3JldHVybntpbml0OmJ9fSl9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGwpe3ZhciB0PXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsQj10Ll9uYW1lc3BhY2V8fHQuYXR0cmlidXRlRXJyb3JzLGI9Qj9CKCJBbWF6b25VSVBvcG92ZXJKUyIsIkFtYXpvblVJIik6dDtiLmd1YXJkRmF0YWw/Yi5ndWFyZEZhdGFsKGwpKGIsd2luZG93KTpiLmV4ZWN1dGUoZnVuY3Rpb24oKXtsKGIsd2luZG93KX0pfSkoZnVuY3Rpb24obCx0LEIpe2wud2hlbigiQSIsImEtcG9wb3Zlci1iYXNlLWZhY3RvcnkiKS5yZWdpc3RlcigiYS1wb3BvdmVyLWJhc2UtYXBpcyIsZnVuY3Rpb24oYixkKXtyZXR1cm57c2hvdzpmdW5jdGlvbihiKXt2YXIgYz1kLmdldChiLiR0cmlnZ2VyP2IuJHRyaWdnZXI6Yik7aWYoYylyZXR1cm4gYy5zaG93LmFwcGx5KGMsYXJndW1lbnRzKX0saGlkZTpmdW5jdGlvbihiKXt2YXIgYz1kLmdldChiKTtpZihjKXJldHVybiBjLnVubG9jaygxKSxjLmhpZGUuYXBwbHkoYyxhcmd1bWVudHMpfSxnZXQ6ZnVuY3Rpb24oYil7cmV0dXJuIGQuZ2V0KGIpfSwKcmVtb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiBkLnJlbW92ZShiKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIiwiYS1wb3BvdmVyLW9iamVjdGNsYXNzIiwiYS1wb3BvdmVyLWRhdGEiKS5yZWdpc3RlcigiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsZnVuY3Rpb24oYixkLGcsYyl7ZnVuY3Rpb24gayhhKXtyZXR1cm4gcFthXT9wW2FdOm51bGx9ZnVuY3Rpb24gZihhLGUpe3JldHVybiBuZXcgZy5Qb3BvdmVyQ2xhc3MoYSxlKX1mdW5jdGlvbiBhKGEsbil7dmFyIGI9bnVsbDtpZigibnVtYmVyIj09PXR5cGVvZiBhKWI9ayhhKTtlbHNlIGlmKCJzdHJpbmciPT09dHlwZW9mIGEpKGI9ZVthXT9lW2FdOm51bGwpfHwoYj1rKGEpKTtlbHNlIGlmKCJvYmplY3QiPT09dHlwZW9mIGEpaWYoYS4kcG9wb3ZlciliPWE7ZWxzZSBpZihhPWgoYSksYj1hLmRhdGEoImEtcG9wb3Zlci1pZCIpLGJ8fChiPWEuZmluZCgiLmEtZGVjbGFyYXRpdmUiKS5lcSgwKSxiPWIubGVuZ3RoPwpiLmRhdGEoImEtcG9wb3Zlci1pZCIpOm51bGwpLGI9ayhiKSwhYil7dmFyIG09YS5kYXRhKCJhY3Rpb24iKTsobT1tP2EuZGF0YShtKTpudWxsKSYmbS5uYW1lJiYoYj1tLm5hbWUsYj1lW2JdP2VbYl06bnVsbCwhYnx8biYmYi50eXBlIT09bj9iPW51bGw6KG49KG49Yi5hdHRycygiY3VycmVudERhdGFTdHJhdGVneSIpKT9jLmdldFN0cmF0ZWd5QnlOYW1lKG4pOmMuZ3Vlc3NTdHJhdGVneUJ5QXR0cnMoYi5hdHRycygpKSkmJm4ucmV1c2VQb3BvdmVyP2IuJHRyaWdnZXJbMF0hPT1hWzBdJiYoYi4kdHJpZ2dlci5kYXRhKCJhLXBvcG92ZXItaWQiLG51bGwpLGIuJHRyaWdnZXI9YSk6Yj1udWxsKX1yZXR1cm4gYn1mdW5jdGlvbiBtKCl7cXx8KHE9Zih7aWQ6LTEsJHBvcG92ZXI6diwkdHJpZ2dlcjp2LGltbWVyc2l2ZTohMH0se2lzQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGhpZGVNZXRob2Q6ZnVuY3Rpb24oKXt0aGlzLmhpZGVDaGlsZHJlbigpfSxzaG93TWV0aG9kOmIuY29uc3RhbnRzLk5PT1B9KSk7CnJldHVybiBxfXZhciBoPWIuJCxuPTEsZT17fSxwPXt9LHY9aCgiXHgzY2RpdiBpZFx4M2QnYS1wb3BvdmVyLXJvb3QnIHN0eWxlXHgzZCd6LWluZGV4Oi0xO3Bvc2l0aW9uOmFic29sdXRlOycgL1x4M2UiKS5hcHBlbmRUbygiYm9keSIpLHE7cmV0dXJue2dldFJvb3Q6bSxnZXQ6ZnVuY3Rpb24oZSxoKXtoPWg/aDp0aGlzP3RoaXMudHlwZTpudWxsO3JldHVybihlPWEoZSxoKSkmJmgmJmUudHlwZSE9PWg/bnVsbDplfSxjcmVhdGU6ZnVuY3Rpb24oYyxnKXt2YXIgZD1oKGMpLHY9Zy5hdHRyaWJ1dGVzfHx7fSxxPWcudHlwZVNwZWNpZmljRnVuY3Rpb25zfHxnLnZhcmlhbnR8fHt9O2c9Zy5hY3Rpb25DaGVja3x8ITE7ZC5kYXRhKCJhLXBvcG92ZXItaWQiKTt2YXIgbD12LnR5cGUsQT1udWxsOyFsfHxkLmhhc0NsYXNzKCJhLWRlY2xhcmF0aXZlIikmJmQuZGF0YSgiYWN0aW9uIikmJi0xIT09ZC5kYXRhKCJhY3Rpb24iKS5pbmRleE9mKGwpfHwoZD1iLmRlY2xhcmF0aXZlLmNyZWF0ZShkLAoiYS0iK2wpLGM9ZFswXSk7aWYoZyYmZC5kYXRhKCJhY3Rpb24iKSYmLTE9PT1kLmRhdGEoImFjdGlvbiIpLmluZGV4T2YobCkpcmV0dXJuIG51bGw7bCYmZCYmKEE9YShkKSk7aWYoQSlyZXR1cm4gQS50eXBlIT09bD9udWxsOkE7ZD12O2M9aChjKTsodj1kLnR5cGUpPygtMT09PWguaW5BcnJheSh2LFsibW9kYWwiLCJzZWNvbmRhcnktdmlldyIsInBvcG92ZXIiXSl8fGQucG9wb3ZlckxhYmVsfHx0LnVlTG9nRXJyb3ImJi0xIT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXS5jbGFzc05hbWUuaW5kZXhPZigiYS1hdWlfYWNjZXNzaWJpbGl0eV80OTg2MC10MSIpJiZ0LnVlTG9nRXJyb3Ioe21lc3NhZ2U6Iltwb3BvdmVyTGFiZWwgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBhbGwgQVVJIHBvcG92ZXJzLCBtb2RhbHMgYW5kIHNlY29uZGFyeSB2aWV3cyBmb3IgYWNjZXNzaWJpbGl0eSByZWFzb25zLiBQbGVhc2Ugc2VlIGh0dHA6Ly90aW55L2c4bXhvMW1rL2F1aWFtYXpkZXZlcG9wbyBmb3IgbW9yZSBkZXRhaWxzXSJ9LAp7bG9nTGV2ZWw6IkVSUk9SIn0pLGMmJmMubGVuZ3RoPyhkPWIuZXh0ZW5kKHtpZDpuKyssJHRyaWdnZXI6YywkdHJpZ2dlcldyYXBwZXI6bnVsbH0sZCkscT1iLmNvcHkocSkscT1mKGQscSkscFtxLmlkXT1xLHEubmFtZSYmKGVbcS5uYW1lXT1xKSxjLmRhdGEoImEtcG9wb3Zlci1pZCIscS5pZCksYz1xLiR0cmlnZ2VyLmNsb3Nlc3QoIi5hLXBvcG92ZXIiKSxjPSFxLmF0dHJzKCJpbW1lcnNpdmUiKSYmYy5sZW5ndGg/ayhjLmRhdGEoImEtcG9wb3Zlci1pZCIpKXx8bSgpOm0oKSxxLnBhcmVudD1jLGMuY2hpbGRyZW4ucHVzaChxKSk6cT1udWxsKTpxPW51bGw7cmV0dXJuIHF9LHJlbW92ZTpmdW5jdGlvbihhLGgpe2E9dGhpcy5nZXQoYSk7dmFyIG49ITE7aWYoYSl7bj1hLmlkO2lmKGEmJi0xPG4pe3ZhciBjPWIuaW5kZXhPZkFycmF5KGEucGFyZW50LmNoaWxkcmVuLGEpLG09YS4kY29udGFpbmVyLGc9YS4kdHJpZ2dlcjthLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoYywxKTthLnVubG9jaygpLmhpZGUoKTsKYS51cGRhdGUoe2NvbnRlbnQ6IiJ9KTttJiZhLiRjb250YWluZXIucmVtb3ZlKCk7Zy5kYXRhKCJhLXBvcG92ZXItaWQiLCIiKTthLm5hbWUmJmRlbGV0ZSBlW2EubmFtZV07ZGVsZXRlIHBbbl07bj0hMH1lbHNlIG49ITE7aCYmYi5kZWNsYXJhdGl2ZS5yZW1vdmUoYS4kdHJpZ2dlclswXSwiYS0iK2gpfXJldHVybiBufX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLXV0aWwiLCJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IikucmVnaXN0ZXIoImEtcG9wb3Zlci1iYXNlLWhhbmRsZXJzIixmdW5jdGlvbihiLGQsZyl7ZnVuY3Rpb24gYyhhKXtmb3IodmFyIGg7YS5sZW5ndGgmJiEoaD1hLmRhdGEoImEtcG9wb3Zlci1pZCIpKTspYT1hLnBhcmVudCgpO3JldHVybiBnLmdldChoKX12YXIgaz1iLiQ7ayhkb2N1bWVudCkuYmluZCgiY2xpY2sgIitiLmFjdGlvbi5zdGFydCxmdW5jdGlvbihhKXt2YXIgaD1rKGEudGFyZ2V0KSxuPWEub3JpZ2luYWxFdmVudDtpZighKG4mJgpuLnBvaW50ZXJUeXBlJiZuLnBvaW50ZXJUeXBlPT09Yi5wb2ludGVyVHlwZS50b3VjaCYmImNsaWNrIj09PW4udHlwZXx8aC5oYXNDbGFzcygiYS1tb2RhbC1zY3JvbGxlciIpfHwiYS1wb3BvdmVyLWxndGJveCI9PT1oWzBdLmlkfHwiaHRtbCI9PT1oWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXt2YXIgZT1mdW5jdGlvbihlKXtyZXR1cm4gZC5ldmVudE9jY3Vyc1dpdGhpbihhLGUpfTtiLmVhY2goZy5nZXRSb290KCkuY2hpbGRyZW4sZnVuY3Rpb24oYSl7aWYoYS5pc1Zpc2libGUoKXx8YS5pc0NvbnRlbnRMb2FkZWQoKSl7dmFyIGg9ZC5zZWFyY2goYSxlKTtoP2guaGlkZUNoaWxkcmVuKCk6bnVsbCE9PWEuYXR0cnMoImxpZ2h0Ym94T3B0aW9ucyIpfHxhLmF0dHJzKCJpbW1lcnNpdmUiKXx8YS51bmxvY2soMSkuaGlkZSgpfX0pfX0pO2IuZGVjbGFyYXRpdmUoImEtcG9wb3Zlci1jbG9zZSIsWyJjbGljayIsYi5hY3Rpb24uc3RhcnRdLGZ1bmN0aW9uKGEpe3ZhciBoPWMoYS4kdGFyZ2V0KTsKaCYmKGgudW5sb2NrKCkuaGlkZSgpLGQudHJpZ2dlcigiZGlzbWlzcyIsaCkpO2EuJGV2ZW50LnByZXZlbnREZWZhdWx0KCl9KTt2YXIgZj1udWxsLGE9bnVsbDtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXItYTExeSIsImZvY3Vzb3V0IixmdW5jdGlvbihhKXt2YXIgaD1jKGEuJHRhcmdldCk7aCYmYS4kdGFyZ2V0Lmxlbmd0aCYmaC4kZmlyc3RUYWJiYWJsZS5sZW5ndGgmJmEuJHRhcmdldFswXT09PWguJGZpcnN0VGFiYmFibGVbMF0mJiEoZiYmMTAwPmIubm93KCktZikmJihmPWIubm93KCksYi5kZWxheShmdW5jdGlvbigpe2soZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuaGFzQ2xhc3MoImEtcG9wb3Zlci1zdGFydCIpJiZoLiRsYXN0VGFiYmFibGUuZm9jdXMoKX0sMCkpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyLWExMXkiLCJmb2N1c2luIixmdW5jdGlvbihnKXt2YXIgaD1jKGcuJHRhcmdldCk7aCYmZy4kdGFyZ2V0Lmxlbmd0aCYmZy4kdGFyZ2V0Lmhhc0NsYXNzKCJhLXBvcG92ZXItZW5kIikmJgohKGEmJjEwMD5iLm5vdygpLWEpJiYoYT1iLm5vdygpLGIuZGVsYXkoZnVuY3Rpb24oKXtoLiRmaXJzdFRhYmJhYmxlLmZvY3VzKCl9LDApKX0pO2IuZGVjbGFyYXRpdmUoImEtcG9wb3Zlci1hMTF5Iiwia2V5ZG93biIsZnVuY3Rpb24oYSl7dmFyIGg9YS4kZXZlbnQ7aC5rZXlDb2RlPT09Yi5jb25zdGFudHMua2V5Y29kZXMuRVNDQVBFJiYoYT1jKGEuJHRhcmdldCksaC5wcmV2ZW50RGVmYXVsdCgpLGEmJmEuaGlkZSgpKX0pO2Iub24oInJlc2l6ZSB6b29tIixmdW5jdGlvbigpe2cuZ2V0Um9vdCgpLnVwZGF0ZVBvc2l0aW9uKCl9KTtpZihiLmNhcGFiaWxpdGllcy5pc1NhZmFyaSYmYi5jYXBhYmlsaXRpZXMuaW9zKWIub24oImE6cG9wb3ZlcjpyZWZyZXNoIixmdW5jdGlvbihhKXthPWEucG9wb3ZlcjthLiRwb3BvdmVyJiZhLiRwb3BvdmVyLnVuZGVsZWdhdGUoJ2lucHV0W3R5cGVceDNkImRhdGUiXScsImJsdXIiKS5kZWxlZ2F0ZSgnaW5wdXRbdHlwZVx4M2QiZGF0ZSJdJywiYmx1ciIsCmZ1bmN0aW9uKCl7dmFyIGE9Yi4kKHQpO2Euc2Nyb2xsVG9wKGEuc2Nyb2xsVG9wKCkrMSl9KX0pfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci1iYXNlLWFwaXMiLCJhLXBvcG92ZXItYmFzZS1oYW5kbGVycyIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYmFzZSIsZnVuY3Rpb24oYixkLGcpe3JldHVybiBkfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIiwiYS1wb3BvdmVyLWRhdGEiLCJhLXBvcG92ZXItcG9zaXRpb24iLCJhLXBvcG92ZXItbGlnaHRib3giLCJhLXBvcG92ZXItYW5pbWF0ZSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItb2JqZWN0Y2xhc3MiLGZ1bmN0aW9uKGIsZCxnLGMsayxmKXtmdW5jdGlvbiBhKGEsZSl7dmFyIGM9LTEsZz1bMV0sbD0tMjt0aGlzLnBhcmVudD1udWxsO3RoaXMuY2hpbGRyZW49W107dGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnM9e307dGhpcy5hdHRyaWJ1dGVzPXtwb3NpdGlvbjoidHJpZ2dlclZlcnRpY2FsIiwKYWxvbmU6ITEsaW1tZXJzaXZlOiExLHJlc3RvcmVGb2N1c09uSGlkZTohMH07dmFyIHI9ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlKCk/dGhpcy5fd2lsbFRyaWdnZXJFdmVudHMmJmQudHJpZ2dlcigidmlzaWJsZSIsdGhpcyk6ZC50cmlnZ2VyKCJpbnZpc2libGUiLHRoaXMpO3JldHVybiB0aGlzfSx0PWZ1bmN0aW9uKGEsZSl7dmFyIGM9dGhpcy5pc0FjdGl2ZSgpLGY9dGhpcy5nZXREYXRhU3RyYXRlZ3koKSxkPSF0aGlzLiRwb3BvdmVyLHA9ZXx8ZDtlPSExO2E9YXx8cDtpZighcClmb3IodmFyIGs9Zy5sZW5ndGg7ay0tJiYhcDspcD0hbltnW2tdXTtwJiYocD11LmFwcGx5KHRoaXMpLHA9aChwKSxkfHwoZi51bmxvYWRDb250ZW50KHRoaXMpLHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKSxlPSEwKSxoKCJib2R5IikuYXBwZW5kKHApLHRoaXMuJGNvbnRhaW5lcj1wLHRoaXMuJHBvcG92ZXI9dGhpcy4kY29udGFpbmVyLmhhc0NsYXNzKCJhLXBvcG92ZXIiKT90aGlzLiRjb250YWluZXI6CnRoaXMuJGNvbnRhaW5lci5maW5kKCIuYS1wb3BvdmVyIiksdGhpcy4kc3RhcnRBbmNob3I9dGhpcy4kcG9wb3Zlci5oYXNDbGFzcygiYS1wb3BvdmVyLXN0YXJ0Iik/dGhpcy4kcG9wb3Zlcjp0aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItc3RhcnQiKSx0aGlzLiRlbmRBbmNob3I9dGhpcy4kcG9wb3Zlci5maW5kKCIuYS1wb3BvdmVyLWVuZCIpLHRoaXMuJHBvcG92ZXIuYXR0cigiaWQiLCJhLXBvcG92ZXItIit0aGlzLmlkKS5kYXRhKCJhLXBvcG92ZXItaWQiLHRoaXMuaWQpKTt0aGlzLmF0dHJzKCJpbW1lcnNpdmUiKXx8KHA9cGFyc2VJbnQodGhpcy5wYXJlbnQuJHBvcG92ZXIuY3NzKCJ6LWluZGV4IiksMTApLGIuaXNGaW5pdGVOdW1iZXIocCl8fChwPXRoaXMucGFyZW50LmF0dHJzKCJpbW1lcnNpdmUiKT8xMDEwOjApLHRoaXMuJHBvcG92ZXIuY3NzKCJ6LWluZGV4IixNYXRoLm1heCgyOTksMTAwK3ApKSk7aWYoZi5zaG91bGRSZWZyZXNoQ29udGVudCh0aGlzKXx8YSllfHwKZi51bmxvYWRDb250ZW50KHRoaXMpLGYubG9hZENvbnRlbnQodGhpcyxkKTt0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy51cGRhdGVEaW1lbnNpb25zIT09bSYmdGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMudXBkYXRlRGltZW5zaW9ucy5hcHBseSh0aGlzKTtnPVtdO2MmJkMuY2FsbCh0aGlzLFtdLCExKTthPXRoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmZpbmQoImEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleFx4M2QnLTEnXSkiKTthPWEubm90KCIuYS1kcm9wZG93bi1saW5rIik7dGhpcy4kZmlyc3RUYWJiYWJsZT10aGlzLiRwb3BvdmVyLmZpbmQoJ1tkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWNsb3NlIl0nKTt0aGlzLiRmaXJzdFRhYmJhYmxlPXRoaXMuJGZpcnN0VGFiYmFibGUubGVuZ3RoP3RoaXMuJGZpcnN0VGFiYmFibGU6YS5maXJzdCgpO3RoaXMuJGxhc3RUYWJiYWJsZT0wPT09CmEubGVuZ3RoP3RoaXMuJGZpcnN0VGFiYmFibGU6YS5sYXN0KCk7cmV0dXJuIHRoaXN9LEM9ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBoKCl7Yy51cGRhdGVQb3NpdGlvbigpO3ZhciBiPWMuYXR0cnMoIm5hdmlnYXRlIik7IWUmJmImJmMuYXR0cnMoIm5hdmlnYXRlIiwhMSk7Zy5jYWxsKGMscixhKTtlJiZkLnRyaWdnZXIoInNob3ciLGMpO3AmJnAuYXBwbHkoYyxhKTtlJiZkLnRyaWdnZXIoImFmdGVyU2hvdyIsYyk7Yy4kcG9wb3Zlci5hdHRyKCJhcmlhLWhpZGRlbiIsImZhbHNlIik7IWUmJmImJmMuYXR0cnMoIm5hdmlnYXRlIixiKTtsPTJ9dmFyIGM9dGhpcztlPSEhZTt2YXIgbj1jLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucyxnPW4uc2hvd01ldGhvZCE9PW0/bi5zaG93TWV0aG9kOnYsZj1uLmJlZm9yZVNob3dNZXRob2QhPT1tP24uYmVmb3JlU2hvd01ldGhvZDpudWxsLHA9bi5hZnRlclNob3dNZXRob2QhPT1tP24uYWZ0ZXJTaG93TWV0aG9kOm51bGw7bD0xO2MuX3dpbGxUcmlnZ2VyRXZlbnRzPQplO2MuYXR0cnMoIm9yaWdpbmFsRm9jdXMiLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO2MuJHBvcG92ZXIuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuYWRkQ2xhc3MoImEtcG9wb3Zlci1oaWRkZW4iKS5zaG93KCk7ZiYmZi5hcHBseShjLGEpO2MuYXR0cnMoInN5bmNocm9ub3VzIik/aCgpOmIuZGVsYXkoZnVuY3Rpb24oKXtoKCl9LDApfTt0aGlzLnNob3c9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGU9YS5hdHRycygibGlnaHRib3hPcHRpb25zIil8fG51bGw7aWYoYS5pc0FjdGl2ZSgpfHxmLmlzQW5pbWF0aW5nKGEpKXJldHVybiB0aGlzO2EubG9jaygxKTtlJiZrLmxvY2soMSk7YS5hdHRycygiYWxvbmUiKSYmYi5lYWNoKGEucGFyZW50LmNoaWxkcmVuLGZ1bmN0aW9uKGUpe2UuaXNBY3RpdmUoKSYmZS5pZCE9PWEuaWQmJiFlLmF0dHJzKCJtb2RlbGVzcyIpJiZlLnVubG9jaygpLmhpZGUoKX0pO2QudHJpZ2dlcigiYmVmb3JlU2hvdyIsYSk7aWYoIWEuJGNvbnRhaW5lcnx8YS5pc0RpcnR5KCl8fAphLmdldERhdGFTdHJhdGVneSgpLnNob3VsZFJlZnJlc2hDb250ZW50KGEpKWQudHJpZ2dlcigicmVmcmVzaCIsYSksdC5jYWxsKGEpO2lmKGEuZHJhZ2dhYmxlKXt2YXIgaD1hLiRjb250YWluZXI7Yi5kcmFnZ2FibGUoaCx7aGFuZGxlOmguZmluZCgiLmEtcG9wb3Zlci1kcmFnZ2FibGUtaGFuZGxlIil9KX1lJiZrLnNob3coYi5leHRlbmQoe3BvcG92ZXI6YX0sZSkpO0MuY2FsbChhLGFyZ3VtZW50cywhMCk7Yi5kZWxheShmdW5jdGlvbigpe2EudW5sb2NrKDEpO2UmJmsudW5sb2NrKDEpfSwwKTtyZXR1cm4gdGhpc307dGhpcy5oaWRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxlPWEudHlwZVNwZWNpZmljRnVuY3Rpb25zLGM9ZS5oaWRlTWV0aG9kIT09bT9lLmhpZGVNZXRob2Q6cSxuPWUuYmVmb3JlSGlkZU1ldGhvZCE9PW0/ZS5iZWZvcmVIaWRlTWV0aG9kOm51bGwsZz1lLmFmdGVySGlkZU1ldGhvZCE9PW0/ZS5hZnRlckhpZGVNZXRob2Q6bnVsbCx2PWEuYXR0cnMoImxpZ2h0Ym94T3B0aW9ucyIpfHwKbnVsbDtpZighYS5pc0FjdGl2ZSgpfHxhLmlzTG9ja2VkKCl8fGYuaXNBbmltYXRpbmcoYSkpcmV0dXJuIHRoaXM7bD0tMTthLmhpZGVDaGlsZHJlbigpO2QudHJpZ2dlcigiYmVmb3JlSGlkZSIsYSk7biYmbi5hcHBseShhLGFyZ3VtZW50cyk7Yy5jYWxsKGEscixhcmd1bWVudHMpO2QudHJpZ2dlcigiaGlkZSIsYSk7Yi5kZWxheShmdW5jdGlvbigpe2cmJmcuYXBwbHkoYSxhcmd1bWVudHMpO2EuJHBvcG92ZXIuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIik7diYmKGEucGFyZW50LmF0dHJzKCJsaWdodGJveE9wdGlvbnMiKT9rLnNob3coYi5leHRlbmQoe3BvcG92ZXI6YS5wYXJlbnR9LHYpKTprLmhpZGUodikpO2QudHJpZ2dlcigiYWZ0ZXJIaWRlIixhKTtsPS0yO2lmKGEuYXR0cnMoInJlc3RvcmVGb2N1c09uSGlkZSIpKXt2YXIgZT1udWxsOyJkcm9wZG93biI9PT1hLnR5cGU/ZT1hLnNvdXJjZUJ1dHRvbi5maW5kKCJbYXJpYS1wcmVzc2VkXSIpOmEuJHRyaWdnZXImJmgoYS4kdHJpZ2dlcikubGVuZ3RoJiYKKGU9YS4kdHJpZ2dlci5pcygiYSwgaW5wdXQsIGJ1dHRvbiIpP2EuJHRyaWdnZXI6YS4kdHJpZ2dlci5maW5kKCJhLCBpbnB1dCwgYnV0dG9uIikpO2UmJmUubGVuZ3RofHwoZT1oKGEuYXR0cnMoIm9yaWdpbmFsRm9jdXMiKSkpOyFlLmxlbmd0aHx8cCYmIWUuaXMoIjp2aXNpYmxlIil8fGIuZGVsYXkoZnVuY3Rpb24oKXtlLmZvY3VzKCl9LDQwMCl9fSwwKTtyZXR1cm4gdGhpc307dGhpcy51cGRhdGU9ZnVuY3Rpb24oYSl7dmFyIGU9InN0cmluZyI9PT10eXBlb2YgYT97Y29udGVudDphfTpiLmNvcHkoYSksaD10aGlzLmF0dHJzKCk7YT10aGlzLmdldERhdGFTdHJhdGVneSgpO2IuZWFjaChlLGZ1bmN0aW9uKGEsZSl7KGEmJiFoW2VdfHxoW2VdJiZoW2VdIT09YSkmJmcucHVzaChlKX0pO3RoaXMuaXNEaXJ0eSgpJiYoZT1iLmV4dGVuZCh7fSxoLGUpLHRoaXMuYXR0cnMoZSksdGhpcy5nZXREYXRhU3RyYXRlZ3koZSksdGhpcy4kcG9wb3ZlciYmYS51bmxvYWRDb250ZW50KHRoaXMpLAp0aGlzLmlzQWN0aXZlKCkmJih0LmNhbGwodGhpcywhMCksdGhpcy5mb2N1cygpKSk7cmV0dXJuIHRoaXN9O3RoaXMucmVmcmVzaD1mdW5jdGlvbihhLGUpe3JldHVybiB0LmNhbGwodGhpcyxhfHwhMCxlfHwhMSl9O3RoaXMuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gMTw9bH07dGhpcy5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gMj09PWx9O3RoaXMuaXNDb250ZW50TG9hZGluZz1mdW5jdGlvbigpe3JldHVybiAzPT09bH07dGhpcy5zZXRDb250ZW50TG9hZGluZz1mdW5jdGlvbigpe2w9M307dGhpcy5pc0NvbnRlbnRMb2FkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gND09PWx9O3RoaXMuc2V0Q29udGVudExvYWRlZD1mdW5jdGlvbigpe2w9NH07dGhpcy5pc0RpcnR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA8Zy5sZW5ndGh9O3RoaXMubG9jaz1mdW5jdGlvbihhKXthfHwoYT0xMCk7YzxhJiYoYz1hKTtyZXR1cm4gdGhpc307dGhpcy51bmxvY2s9ZnVuY3Rpb24oYSl7YXx8KGE9MTApOwpjPD1hJiYoYz0tMSk7cmV0dXJuIHRoaXN9O3RoaXMuaXNMb2NrZWQ9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PWN9O3RoaXMudHlwZVNwZWNpZmljRnVuY3Rpb25zPWU7dGhpcy5hdHRycyhhKTtiLmV4dGVuZCh0aGlzLHRoaXMuYXR0cmlidXRlcyl9dmFyIG0saD1iLiQsbj17bmFtZTohMCx1cmw6ITAsY29udGVudDohMCx3aWR0aDohMCxoZWlnaHQ6ITAsIm1heC13aWR0aCI6ITAsIm1heC1oZWlnaHQiOiEwLCJtaW4td2lkdGgiOiEwLCJtaW4taGVpZ2h0IjohMH0sZT1iLmNhcGFiaWxpdGllcy5tb2JpbGUmJmIuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXMscD1oKCJodG1sIikuaGFzQ2xhc3MoImEtbHQtaWU5Iiksdj1mdW5jdGlvbihhKXt0aGlzLiRwb3BvdmVyLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KS5yZW1vdmVDbGFzcygiYS1wb3BvdmVyLWhpZGRlbiIpO3RoaXMuYXR0cnMoImZvY3VzV2hlblNob3duIikmJiJhamF4IiE9PXRoaXMuYXR0cnMoImN1cnJlbnREYXRhU3RyYXRlZ3kiKSYmCnRoaXMuZm9jdXMoKTthLmNhbGwodGhpcyl9LHE9ZnVuY3Rpb24oYSl7dGhpcy4kcG9wb3Zlci5oaWRlKCkuZmluZCgiLmEtbGd0Ym94LXZlcnRpY2FsLXNjcm9sbCIpLnJlbW92ZUNsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKTthLmNhbGwodGhpcyl9LHU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucztyZXR1cm4gYS5za2luIT09bT9hLnNraW4odGhpcyk6IiJ9LGw9YS5wcm90b3R5cGU7bC5nZXREYXRhU3RyYXRlZ3k9ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnM7YXx8dGhpcy5hdHRycygiY3VycmVudERhdGFTdHJhdGVneSIpfHwoYT10aGlzLmF0dHJzKCkpO2EmJihhPWEuZGF0YVN0cmF0ZWd5P2cuZ2V0U3RyYXRlZ3lCeU5hbWUoYS5kYXRhU3RyYXRlZ3kpOmcuZ3Vlc3NTdHJhdGVneUJ5QXR0cnMoYSkpJiYoZS5kYXRhU3RyYXRlZ3k9YSx0aGlzLmF0dHJzKCJjdXJyZW50RGF0YVN0cmF0ZWd5IixhLm5hbWUpKTsKcmV0dXJuIGUuZGF0YVN0cmF0ZWd5fTtsLmdldENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMuZ2V0Q29udGVudCE9PW0/dGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMuZ2V0Q29udGVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bnVsbH07bC51cGRhdGVDb250ZW50PWZ1bmN0aW9uKGEpe3RoaXMudHlwZVNwZWNpZmljRnVuY3Rpb25zLnVwZGF0ZUNvbnRlbnQhPT1tJiZ0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy51cGRhdGVDb250ZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc307bC5zZXRBcmlhQnVzeT1mdW5jdGlvbihhKXt0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy5zZXRBcmlhQnVzeSE9PW0mJnRoaXMudHlwZVNwZWNpZmljRnVuY3Rpb25zLnNldEFyaWFCdXN5LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc307bC5hamF4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVwZGF0ZSh7dXJsOmF9KX07CmwudXBkYXRlQ2hpbGRyZW5Qb3NpdGlvbj1mdW5jdGlvbigpe2IuZWFjaCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKGEpe2EuaXNBY3RpdmUoKSYmYS51cGRhdGVQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O2wudXBkYXRlUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2lmKC0xPT09YS5pZCliLmVhY2goYS5jaGlsZHJlbixmdW5jdGlvbihhKXthLmlzQWN0aXZlKCkmJmEudXBkYXRlUG9zaXRpb24oKX0pO2Vsc2V7aWYodGhpcy50eXBlU3BlY2lmaWNGdW5jdGlvbnMudXBkYXRlUG9zaXRpb24hPT1tKXJldHVybiB0aGlzLnR5cGVTcGVjaWZpY0Z1bmN0aW9ucy51cGRhdGVQb3NpdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYTt2YXIgZT1hLiRwb3BvdmVyO2IuY2FwYWJpbGl0aWVzLmlzTWV0cm9JRUd1ZXNzJiZiLmNhcGFiaWxpdGllcy5pc0lFVG91Y2hDYXBhYmxlP2UuY3NzKCJvcGFjaXR5IiwuMDEpOmUuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgbj0KZS5maW5kKCIuYS1wb3BvdmVyLWlubmVyIikuY3NzKHtoZWlnaHQ6ImF1dG8iLCJvdmVyZmxvdy15IjoiYXV0byJ9KSxnPWEuYXR0cnMoInBvc2l0aW9uIiksZj17fSxmPWEudHlwZVNwZWNpZmljRnVuY3Rpb25zLnBvc2l0aW9uU3RyYXRlZ3k/Yy5jdXN0b21Qb3NpdGlvbihhLGEudHlwZVNwZWNpZmljRnVuY3Rpb25zLnBvc2l0aW9uU3RyYXRlZ3kpOmNbZ10oYSk7ZC50cmlnZ2VyKCJiZWZvcmVVcGRhdGVQb3NpdGlvbiIsYSk7Zz17dG9wOmYudG9wKyJweCIsbGVmdDpmLmxlZnQrInB4In07Yi5jYXBhYmlsaXRpZXMuaXNNZXRyb0lFR3Vlc3MmJmIuY2FwYWJpbGl0aWVzLmlzSUVUb3VjaENhcGFibGU/Zy5vcGFjaXR5PTE6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIjtlLmNzcyhnKTthLmlzQ29udGVudExvYWRlZCgpJiYwPT09aChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KGEuJHBvcG92ZXIpLmxlbmd0aCYmITA9PT1hLmF0dHJzKCJmb2N1c1doZW5TaG93biIpJiZhLmZvY3VzKCk7CmlmKG4ubGVuZ3RoJiYoIW5bMF0uc3R5bGUuaGVpZ2h0fHwiYXV0byI9PT1uWzBdLnN0eWxlLmhlaWdodCkpe3ZhciBmPWUub3V0ZXJIZWlnaHQoKXx8MCxtPWUuZmluZCgiLmEtcG9wb3Zlci1oZWFkZXIsIC5hLW1vZGFsLWNsb3NlLW5vaGVhZC10b3AiKS5vdXRlckhlaWdodCghMCl8fDAscD1lLmZpbmQoIi5hLXBvcG92ZXItZm9vdGVyIikub3V0ZXJIZWlnaHQoITApfHwwLGc9bi5vdXRlckhlaWdodCgpfHwwLGY9Zi1tLXA7Zz5mJiZuLmNzcyh7aGVpZ2h0OmYrInB4Iiwib3ZlcmZsb3cteSI6InNjcm9sbCJ9KX1kLnRyaWdnZXIoImFmdGVyVXBkYXRlUG9zaXRpb24iLGEpO2QudHJpZ2dlcigicG9zaXRpb25VcGRhdGVkIixhKTtiLmVhY2goYS5jaGlsZHJlbixmdW5jdGlvbihhKXthLmlzQWN0aXZlKCkmJmEudXBkYXRlUG9zaXRpb24oKX0pfTthLmF0dHJzKCJpbW1lcnNpdmUiKSYmKGIuY2FwYWJpbGl0aWVzLm1vYmlsZXx8Yi5jYXBhYmlsaXRpZXMudGFibGV0KT8oZS5jc3Moe3RvcDowLApsZWZ0OjB9KSxiLmRlbGF5KGZ1bmN0aW9uKCl7bigpfSwwKSk6bigpfXJldHVybiBhfTtsLmF0dHJzPWZ1bmN0aW9uKGEsZSl7dmFyIGg9dGhpcztpZihlPT09bSYmIm9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gYT8ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYXR0cmlidXRlc1thXSE9PW0/dGhpcy5hdHRyaWJ1dGVzW2FdOm51bGw6bnVsbDp0aGlzLmF0dHJpYnV0ZXM7Im9iamVjdCI9PT10eXBlb2YgYT9iLmVhY2goYSxmdW5jdGlvbihhLGUpe2guYXR0cnMoZSxhKX0pOiJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmF0dHJpYnV0ZXNbYV09ZSxoW2FdPWUpO3JldHVybiB0aGlzfTtsLmhpZGVDaGlsZHJlbj1mdW5jdGlvbigpe2IuZWFjaCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKGEpe2EudW5sb2NrKDEpO2EuaGlkZSgpfSk7cmV0dXJuIHRoaXN9O2wuZm9jdXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9aCh0KSxuPWMuc2Nyb2xsVG9wKCksZz1hLiRwb3BvdmVyLm9mZnNldCgpLnRvcDsKZSYmbj5nJiZjLnNjcm9sbFRvcChnKTtiLmRlbGF5KGZ1bmN0aW9uKCl7YS4kc3RhcnRBbmNob3IuZm9jdXMoKX0sMCk7cmV0dXJuIHRoaXN9O3JldHVybntQb3BvdmVyQ2xhc3M6YX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJqUXVlcnkiLCJyZWFkeSIpLnJlZ2lzdGVyKCJhLWNoYW5nZW92ZXIiLGZ1bmN0aW9uKGIpe2IoZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1jaGFuZ2VvdmVyOm5vdCguYS1jaGFuZ2VvdmVyLW1hbnVhbCkiLCJ3ZWJraXRBbmltYXRpb25FbmQgYW5pbWF0aW9uZW5kIGNsaWNrIHRvdWNoc3RhcnQiLGZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItdXRpbCIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYWpheC1zdHJhdGVneSIsZnVuY3Rpb24oYixkKXtyZXR1cm57bmFtZToiYWpheCIscmV1c2VQb3BvdmVyOiExLGxvYWRDb250ZW50OmZ1bmN0aW9uKGcsYyl7Zy5zZXRDb250ZW50TG9hZGluZygpOwp2YXIgaz1nLmF0dHJzKCJ1cmwiKSxmPWcuYXR0cnMoInRpbWVvdXQiKXx8MUU0LGE9Zy5hdHRycygiYWpheEZhaWxNc2ciKXx8IlNvcnJ5LCBjb250ZW50IGlzIG5vdCBhdmFpbGFibGUuIixtPSEhZy5hdHRycygiY2FjaGUiKSxoPWcuYXR0cnMoInNwaW5uZXJUaW1lciIpLG49Zy5hdHRycygiYWpheEhhbmRsZXIiKSxlPWcuYXR0cnMoImNvbnRlbnQiKTtnLmF0dHJzKCJjb250ZW50IixudWxsKTtpZihlJiYhYylnLnVwZGF0ZUNvbnRlbnQoZSksaCYmY2xlYXJUaW1lb3V0KGgpLG4mJm4uYWJvcnQmJm4uYWJvcnQoKTtlbHNle3ZhciBwPWZ1bmN0aW9uKCl7cmV0dXJuIWcuYXR0cnMoImNvbnRlbnQiKSYmImFqYXgiPT09Zy5hdHRycygiY3VycmVudERhdGFTdHJhdGVneSIpJiYoZy5pc1Zpc2libGUoKXx8Zy5pc0FjdGl2ZSgpKX0saD1iLmRlbGF5KGZ1bmN0aW9uKCl7cCgpJiYoZC5zaG93U3Bpbm5lcihnKSxnLnNldEFyaWFCdXN5KCEwKSl9LDEwMCksdj1mdW5jdGlvbihhLGUsYyl7cCgpJiYKKGNsZWFyVGltZW91dChoKSxnLnNldENvbnRlbnRMb2FkZWQoKSxkLnRyaWdnZXIoZSxnKSxnLnNldEFyaWFCdXN5KCExKSxnLnVwZGF0ZSh7Y29udGVudDphfSksZy5pc0FjdGl2ZSgpJiZnLnVwZGF0ZVBvc2l0aW9uKCksYyYmZC50cmlnZ2VyKCJhamF4Q29udGVudExvYWRlZCIsZykpfSxuPWIuYWpheChrLHt0eXBlOiJHRVQiLHRpbWVvdXQ6ZixjYWNoZTptLHN1Y2Nlc3M6ZnVuY3Rpb24oYSl7dihhLCJhamF4U3VjY2VzcyIsITApfSxlcnJvcjpmdW5jdGlvbigpe3YoYSwiYWpheEZhaWwiLCExKX19KTtnLmF0dHJzKHtzcGlubmVyVGltZXI6aCxhamF4SGFuZGxlcjpufSl9cmV0dXJuIHRoaXN9LHVubG9hZENvbnRlbnQ6ZnVuY3Rpb24oYil7ZC5jbGVhckNvbnRlbnQoYik7cmV0dXJuIHRoaXN9LHNob3VsZFJlZnJlc2hDb250ZW50OmZ1bmN0aW9uKGIpe3JldHVybiFiLmF0dHJzKCJtYW51YWxSZWZyZXNoIil9LGlzVmFsaWRTdHJhdGVneTpmdW5jdGlvbihiKXtyZXR1cm4hIWIudXJsfX19KTsKInVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIikucmVnaXN0ZXIoImEtcG9wb3Zlci1pbmxpbmUtc3RyYXRlZ3kiLGZ1bmN0aW9uKGIsZCl7cmV0dXJue25hbWU6ImlubGluZSIscmV1c2VQb3BvdmVyOiExLGxvYWRDb250ZW50OmZ1bmN0aW9uKGIpe2Iuc2V0Q29udGVudExvYWRpbmcoKTt2YXIgYz1iLmF0dHJzKCJjb250ZW50Iik7YyYmYi5hdHRycygiY29udGVudCIsbnVsbCk7aWYoIWMpdmFyIGM9Yi4kdHJpZ2dlcixkPWMuZGF0YSgiYWN0aW9uIiksYz1jLmRhdGEoZCl8fHt9LGM9Yy5pbmxpbmVDb250ZW50P2MuaW5saW5lQ29udGVudDpudWxsO2N8fChjPWIuYXR0cnMoImlubGluZUNvbnRlbnQiKSk7Yi51cGRhdGVDb250ZW50KGMpO2Iuc2V0Q29udGVudExvYWRlZCgpO3JldHVybiB0aGlzfSx1bmxvYWRDb250ZW50OmZ1bmN0aW9uKGIpe3ZhciBjPWIuZ2V0Q29udGVudCgpLGM9YyYmMDxjLmxlbmd0aD9jLmh0bWwoKTpiLmF0dHJzKCJpbmxpbmVDb250ZW50IiksCms9Yi4kdHJpZ2dlcixmPWsuZGF0YSgiYWN0aW9uIiksYT1rLmRhdGEoZil8fHt9O2EuaW5saW5lQ29udGVudD1jO2suZGF0YShmLGEpO2QuY2xlYXJDb250ZW50KGIpO3JldHVybiB0aGlzfSxzaG91bGRSZWZyZXNoQ29udGVudDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0RpcnR5KCl9LGlzVmFsaWRTdHJhdGVneTpmdW5jdGlvbihiKXtyZXR1cm4hMH19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIikucmVnaXN0ZXIoImEtcG9wb3Zlci1wcmVsb2FkLXN0cmF0ZWd5IixmdW5jdGlvbihiLGQpe3ZhciBnPWIuJDtyZXR1cm57bmFtZToicHJlbG9hZCIscmV1c2VQb3BvdmVyOiEwLGxvYWRDb250ZW50OmZ1bmN0aW9uKGIpe2Iuc2V0Q29udGVudExvYWRpbmcoKTt2YXIgZD1iLmF0dHJzKCJuYW1lIiksZj1iLmF0dHJzKCJjb250ZW50Iik7Yi5hdHRycygiY29udGVudCIsbnVsbCk7dmFyIGE7YT1nKCIjYS1wb3BvdmVyLSIrZCk7YS5kZXRhY2goKTtpZihhLmxlbmd0aCl7YT0KYVswXTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuZmlyc3RDaGlsZDspbS5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpO2E9bX1lbHNlIGE9ITE7Zj9iLnVwZGF0ZUNvbnRlbnQoZik6ZCYmYi51cGRhdGVDb250ZW50KGEpO2Iuc2V0Q29udGVudExvYWRlZCgpO3JldHVybiB0aGlzfSx1bmxvYWRDb250ZW50OmZ1bmN0aW9uKGMpe3ZhciBrPWMuYXR0cnMoIm5hbWUiKTtpZihrKXt2YXIgZj1jLmdldENvbnRlbnQoKTtpZihmJiZmLmh0bWwoKSl7dmFyIGs9ImEtcG9wb3Zlci0iK2ssYT1nKCIjIitrKTthLmxlbmd0aD9hPWFbMF06KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5pZD1rLGEuY2xhc3NOYW1lPSJhLXBvcG92ZXItcHJlbG9hZCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKSk7az1hO2lmKCFiLnRyaW0oay5pbm5lckhUTUwpKWlmKGY9ZlswXSwic3RyaW5nIj09PXR5cGVvZiBmKWcoaykuaHRtbChmKTtlbHNle2ZvcihhPQpkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zi5maXJzdENoaWxkOylhLmFwcGVuZENoaWxkKGYuZmlyc3RDaGlsZCk7ay5hcHBlbmRDaGlsZChhKX1kLmNsZWFyQ29udGVudChjKX19cmV0dXJuIHRoaXN9LHNob3VsZFJlZnJlc2hDb250ZW50OmZ1bmN0aW9uKGIpe2I9KGI9Yi5hdHRycygibmFtZSIpKT9nKCIjYS1wb3BvdmVyLSIrYik6bnVsbDtyZXR1cm4hKCFifHwhYi5sZW5ndGh8fCIiPT09Yi5odG1sKCkpfSxpc1ZhbGlkU3RyYXRlZ3k6ZnVuY3Rpb24oYil7cmV0dXJuIGIubmFtZT8icHJlbG9hZCI9PT1iLmN1cnJlbnREYXRhU3RyYXRlZ3k/ITA6ISFnKCIjYS1wb3BvdmVyLSIrYi5uYW1lKS5sZW5ndGg6ITF9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1iYXNlLXBvc2l0aW9ucyIsZnVuY3Rpb24oYil7cmV0dXJue3Bvc2l0aW9uU3RyYXRlZ3k6ZnVuY3Rpb24oZCl7dmFyIGc9ZC4kcG9wb3ZlcixjPWQuJHRyaWdnZXIsCms9ZC5tZWFzdXJlO2Q9Zy5maW5kKCIuYS1wb3BvdmVyLWlubmVyIik7ZC5jc3MoeyJtaW4td2lkdGgiOiIwcHgiLHdpZHRoOiJhdXRvIixoZWlnaHQ6ImF1dG8ifSk7dmFyIGY9Yy5jbG9zZXN0KCIuYS1idXR0b24tZHJvcGRvd24iKTtmLmxlbmd0aHx8KGY9Yy5jbG9zZXN0KCIuYS1idXR0b24tZ3JvdXAiKSk7dmFyIGM9ayhnLGYpLGs9Yy53aW5kb3dXaWR0aC0oYy50cmlnZ2VyTGVmdCtjLnBvcG92ZXJXaWR0aCksZj1jLndpbmRvd1dpZHRoLWMudHJpZ2dlckxlZnQtYy50cmlnZ2VyV2lkdGgsYT1jLnRyaWdnZXJMZWZ0LG09e30saD1jLnRyaWdnZXJUb3AtYy53aW5kb3dUb3Asbj1jLndpbmRvd0JvdHRvbS1jLnRyaWdnZXJCb3R0b20sZT1nLmZpbmQoIi5hLXBvcG92ZXItaW5uZXIiKTtoPm4mJm48Yy5wb3BvdmVySGVpZ2h0PyhuPWgsbS50b3A9aDxjLnBvcG92ZXJIZWlnaHQ/Yy50cmlnZ2VyQm90dG9tLWg6Yy50cmlnZ2VyQm90dG9tLWMucG9wb3ZlckhlaWdodCk6bS50b3A9Yy50cmlnZ2VyVG9wOwplLmNzcygiaGVpZ2h0IixuPGMucG9wb3ZlckhlaWdodD9uLWMuaGVhZGVySGVpZ2h0KyJweCI6ImF1dG8iKTtjLnBvcG92ZXJIZWlnaHQ+bj9lLmFkZENsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKTplLnJlbW92ZUNsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKTtkLmhhc0NsYXNzKCJhLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKSYmLTE8bmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZigiV2luZG93cyIpPyhoPU1hdGgubWF4KGMucG9wb3ZlcldpZHRoLGMudHJpZ2dlcldpZHRoKStiLnNjcm9sbEJhcldpZHRoKCEwKSxkLndpZHRoKGgpKTpkLmNzcygibWluLXdpZHRoIixjLnRyaWdnZXJXaWR0aCsicHgiKTtjLnBvcG92ZXJXaWR0aD1nLndpZHRoKCk7bS5sZWZ0PTUwPmsmJmE+Zj9jLnRyaWdnZXJSaWdodC1jLnBvcG92ZXJXaWR0aDpjLnRyaWdnZXJMZWZ0O3JldHVybiBtfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1kcm9wZG93bi1iYXNlLXBvc2l0aW9ucyIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLWJhc2Utdmlldy1iYXNlIiwKZnVuY3Rpb24oYixkKXtyZXR1cm4gYi5leHRlbmQoZCx7dXBkYXRlQ29udGVudDpmdW5jdGlvbihiKXsic3RyaW5nIj09PXR5cGVvZiBiP3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmh0bWwoYik6YiYmdGhpcy4kcG9wb3Zlci5maW5kKCIuYS1wb3BvdmVyLWlubmVyIikuaHRtbCgiIikuYXBwZW5kKGIpfSxiZWZvcmVTaG93TWV0aG9kOmZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQubG9jaygxKTt0aGlzLiR0cmlnZ2VyLmF0dHIoImFyaWEtcHJlc3NlZCIsITApfSxhZnRlclNob3dNZXRob2Q6ZnVuY3Rpb24oKXt2YXIgZz10aGlzLiRwb3BvdmVyLGM9Zy5maW5kKCIuYS1hY3RpdmUiKTtiLmRlbGF5KGZ1bmN0aW9uKCl7Yy5sZW5ndGg/Yy5jbG9zZXN0KCJsaSIpLmZvY3VzKCk6Yz1nLmZpbmQoImxpIikuZmlyc3QoKS5mb2N1cygpfSwwKX0sYmVmb3JlSGlkZU1ldGhvZDpmdW5jdGlvbigpe3RoaXMucGFyZW50LnVubG9jaygxKX0sYWZ0ZXJIaWRlTWV0aG9kOmZ1bmN0aW9uKCl7dGhpcy4kdHJpZ2dlci5hdHRyKCJhcmlhLXByZXNzZWQiLAohMSk7dGhpcy4kcG9wb3Zlci5jc3MoIndpZHRoIiwiYXV0byIpfX0pfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZS12aWV3LWJhc2UiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1iYXNlLXZpZXciLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsImEtZHJvcGRvd24tYmFzZS12aWV3IikucmVnaXN0ZXIoImEtZHJvcGRvd24tYmFzZS1mYWN0b3J5IixmdW5jdGlvbihiLGQsZyl7ZnVuY3Rpb24gYyhoLG4sZSl7dmFyIGM9WydceDNjbGkgdGFiaW5kZXhceDNkIjAiIHJvbGVceDNkIm9wdGlvbiInXSxmPWguZGF0YSgiYUNzc0NsYXNzIiksZz1oLmRhdGEoImFJZCIpLG09aC5kYXRhKCJhSHRtbENvbnRlbnQiKSxkPWguZGF0YSgiYUltYWdlU291cmNlIiksaz1KU09OLnN0cmluZ2lmeSh7c3RyaW5nVmFsOmgudmFsKCl9KSxrPVsnXHgzY2EgdGFiaW5kZXhceDNkIi0xIiBocmVmXHgzZCJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtdmFsdWVceDNkIicsCmIuZXNjYXBlSHRtbChrKSwnIiddLGw9WyJhLWRyb3Bkb3duLWxpbmsiXSx0PVsiYS1kcm9wZG93bi1pdGVtIl07biYmKGwucHVzaCgiYS1hY3RpdmUiKSxjLnB1c2goJyBhcmlhLWNoZWNrZWRceDNkInRydWUiJykpO2EmJihiLmNhcGFiaWxpdGllcy5tb2JpbGV8fGIuY2FwYWJpbGl0aWVzLnRhYmxldCkmJmwucHVzaCgiYS1saXN0LWxpbmstYWZ0ZXItZ3JvdXAiKTthPSExO2YmJnQucHVzaChmKTtnJiZjLnB1c2goJyBpZFx4M2QiJytnKyciJyk7Yy5wdXNoKCdhcmlhLWxhYmVsbGVkYnlceDNkIicpO2MucHVzaChlKTtjLnB1c2goJyInKTtrLnB1c2goJyBpZFx4M2QiJyk7ay5wdXNoKGUpO2sucHVzaCgnIicpO2MucHVzaCgnIGNsYXNzXHgzZCInK3Quam9pbigiICIpKyciJyk7Yy5wdXNoKCJceDNlIik7bT9uPW06KG49W10sZCYmKGwucHVzaCgiYS1vcHRpb24taGFzLWltYWdlIiksbi5wdXNoKCdceDNjaW1nIHNyY1x4M2QiJytkKyciIGNsYXNzXHgzZCJhLXJpY2gtb3B0aW9uLWltYWdlIiAvXHgzZScpKSwKbi5wdXNoKGguaHRtbCgpKSxuPW4uam9pbigiIikpO2sucHVzaCgnIGNsYXNzXHgzZCInKTtrLnB1c2gobC5qb2luKCIgIikpO2sucHVzaCgnIlx4M2UnKTtrLnB1c2gobik7ay5wdXNoKCJceDNjL2FceDNlIik7Yy5wdXNoKGsuam9pbigiIikpO2MucHVzaCgiXHgzYy9saVx4M2UiKTtyZXR1cm4gYy5qb2luKCIiKX1mdW5jdGlvbiBrKGIpe2IuanF1ZXJ5fHwoYj1mKGIpKTt2YXIgbj1iLmNoaWxkcmVuKCJvcHRncm91cCxvcHRpb246bm90KC5hLXByb21wdCkiKSxlPSExLGc9YlswXSxkPWIuYXR0cigiaWQiKT9iLmF0dHIoImlkIik6ImRyb3Bkb3duIittKyssayxsOy0xPGcuc2VsZWN0ZWRJbmRleCYmKGs9Zy5vcHRpb25zW2cuc2VsZWN0ZWRJbmRleF0udmFsdWUpO2w9WydceDNjdWwgdGFiaW5kZXhceDNkIi0xIiBjbGFzc1x4M2QiYS1ub3N0eWxlIGEtbGlzdC1saW5rJyxiLmRhdGEoImEtaGFzLWltYWdlcyIpPyIgYS1ib3gtbGlzdCI6IiIsJyIgcm9sZVx4M2QiYXBwbGljYXRpb24iIGFyaWEtbXVsdGlzZWxlY3RhYmxlXHgzZCJmYWxzZSJceDNlJ107CnZhciByPTA7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKTtiLmlzKCJvcHRncm91cCIpPyhiLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbihhKXtsLnB1c2goYyhmKHRoaXMpLGs9PT10aGlzLnZhbHVlLGQrIl8iK3IrKykpfSksbC5wdXNoKCdceDNjbGkgdGFiaW5kZXhceDNkIi0xIiBjbGFzc1x4M2QiZGl2aWRlciJceDNlXHgzY2hyIC9ceDNlXHgzYy9saVx4M2UnKSxlPWE9ITApOihsLnB1c2goYyhiLGs9PT10aGlzLnZhbHVlLGQrIl8iK3IrKykpLGU9ITEpfSk7ZSYmbC5wb3AoKTtsLnB1c2goIlx4M2MvdWxceDNlIik7cmV0dXJuIGwuam9pbigiIil9dmFyIGY9Yi4kLGE9ITEsbT0xO3JldHVybiBiLmV4dGVuZCh7Y3JlYXRlOmQuY3JlYXRlLHJlbW92ZTpkLnJlbW92ZSxnZXQ6ZC5nZXR9LHt0eXBlOiJkcm9wZG93biIsY3JlYXRlOmZ1bmN0aW9uKGEsbixlKXt2YXIgYz1uLiRidXR0b24sZj1uLiRzb3VyY2VTZWxlY3QsbT1mWzBdLGw9Yy5maW5kKCIuYS1kcm9wZG93bi1sYWJlbCIpLApyPWYuZGF0YSgiYVRvdWNoSGVhZGVyIik7aWYoIXJ8fCFyLmxlbmd0aCYmbC5sZW5ndGgpcj1sLnRleHQoKTtyZXR1cm4gZC5jcmVhdGUoYSx7YXR0cmlidXRlczp7dHlwZToiZHJvcGRvd24iLGhlYWRlcjpyLGNsb3NlQnV0dG9uTGFiZWw6bi5jbG9zZUJ1dHRvbkxhYmVsP24uY2xvc2VCdXR0b25MYWJlbDoiQ2xvc2UiLGlubGluZUNvbnRlbnQ6Zixwb3NpdGlvbjpuLnBvc2l0aW9uLGFsb25lOiEwLHNvdXJjZVNlbGVjdDpmLHNvdXJjZUJ1dHRvbjpjLG5hbWU6ZlswXS5uYW1lLHByZXZlbnROYW1lUmV1c2U6ITAsbGlnaHRib3hPcHRpb25zOmIuY2FwYWJpbGl0aWVzLm1vYmlsZXx8Yi5jYXBhYmlsaXRpZXMudGFibGV0P3tzaG93RHVyYXRpb246Yi5jYXBhYmlsaXRpZXMuaW9zP251bGw6MCxoaWRlRHVyYXRpb246MH06bnVsbH0sdHlwZVNwZWNpZmljRnVuY3Rpb25zOmIuZXh0ZW5kKHt9LGcsZSx7c2tpbjpmdW5jdGlvbihhKXt2YXIgYj1lLnN1YnNraW4/ZS5zdWJza2luKG0pOmsobSk7CmEuYXR0cnMoImlubGluZUNvbnRlbnQiLGIpO3JldHVybiBlLnNraW4oYSl9fSksYWN0aW9uQ2hlY2s6ITF9KX19KX0pOyJ1c2Ugc3RyaWN0IjsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1kcm9wZG93bi1iYXNlLWZhY3RvcnkiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1rZXlib2FyZC1oYW5kbGVycyIsZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBnKGEpe2EucmVtb3ZlRGF0YSgiYS11c2VyLW5hdmlnYXRlZC10ZXh0IikucmVtb3ZlRGF0YSgiYS11c2VyLW5hdmlnYXRlZC1pZHgiKX1mdW5jdGlvbiBjKGEsZSl7YS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIik7Im9wdGlvbiI9PT1lLmF0dHIoInJvbGUiKSYmZS5hdHRyKCJhcmlhLXNlbGVjdGVkIiwidHJ1ZSIpO2UuZm9jdXMoKX1mdW5jdGlvbiBrKGEpe3ZhciBlPWEucGFyZW50KCJ1bCIpO2E9ZS5maW5kKCJsaSIpO3ZhciBiPWUuZmluZCgiOmZvY3VzIik7MT5iLmxlbmd0aCYmKGI9ZS5maW5kKCdbYXJpYS1jaGVja2VkXHgzZCJ0cnVlIl0nKSk7CmU9YjtyZXR1cm57aW5kZXg6MDxlLmxlbmd0aD9lLmluZGV4KCk6MCwkb3B0aW9uczphfX1mdW5jdGlvbiBmKGEsZSxiKXthLnByZXZlbnREZWZhdWx0KCk7ZS5maW5kKCJhIikuZXEoMCkudHJpZ2dlcigiY2xpY2siKTtnKGIpfWZ1bmN0aW9uIGEoYSl7dmFyIGU9YS5kYXRhKCJhLXVzZXItbmF2aWdhdGVkLWRlYm91bmNlciIpO2V8fChlPWIuZGVib3VuY2UoZnVuY3Rpb24oKXtnKGEpfSwxRTMpLGEuZGF0YSgiYS11c2VyLW5hdmlnYXRlZC1kZWJvdW5jZXIiLGUpKTtlKCl9dmFyIG09Yi4kLGg9Yi5jb25zdGFudHMua2V5Y29kZXM7cmV0dXJue2tleURvd246ZnVuY3Rpb24oYSl7dmFyIGU9bSh0aGlzKSxiPWUucGFyZW50KCk7c3dpdGNoKGEud2hpY2gpe2Nhc2UgaC5VUF9BUlJPVzphLnByZXZlbnREZWZhdWx0KCk7ZyhiKTswPGsoZSkuaW5kZXgmJmMoZSxlLnByZXYoKSk7YnJlYWs7Y2FzZSBoLkRPV05fQVJST1c6YS5wcmV2ZW50RGVmYXVsdCgpO2coYik7Yj1rKGUpO2E9Yi5pbmRleDsKMDw9YSYmYSsxPGIuJG9wdGlvbnMubGVuZ3RoJiZjKGUsZS5uZXh0KCkpO2JyZWFrO2Nhc2UgaC5FTlRFUjpmKGEsZSxiKTticmVhaztjYXNlIGguRVNDQVBFOmEucHJldmVudERlZmF1bHQoKTtlPWQuZ2V0KGUuY2xvc2VzdCgiLmEtcG9wb3ZlciIpKTtlLnNvdXJjZUJ1dHRvbi5maW5kKCIuYS1idXR0b24tdGV4dCIpLmZvY3VzKCk7ZS5oaWRlKCk7ZyhiKTticmVhaztjYXNlIGguU1BBQ0U6Yi5kYXRhKCJhLXVzZXItbmF2aWdhdGVkLXRleHQiKXx8ZihhLGUsYik7YnJlYWs7Y2FzZSBoLlRBQjpnKGIpO2JyZWFrO2Nhc2UgaC5CQUNLU1BBQ0U6YS5wcmV2ZW50RGVmYXVsdCgpfX0sa2V5UHJlc3M6ZnVuY3Rpb24oYyl7dmFyIGU9bSh0aGlzKSxnPWUucGFyZW50KCksaz1kLmdldChlLmNsb3Nlc3QoIi5hLXBvcG92ZXIiKSksbD1jLndoaWNoO2lmKGsmJmsuaXNBY3RpdmUoKSYmbCE9PWguVEFCJiYwIT09bCl7YShnKTt2YXIgdT1nLmRhdGEoImEtdXNlci1uYXZpZ2F0ZWQtaWR4Iil8fAowO2lmKCEoMD51KSl7az0oZy5kYXRhKCJhLXVzZXItbmF2aWdhdGVkLXRleHQiKXx8IiIpK1N0cmluZy5mcm9tQ2hhckNvZGUobCkudG9Mb2NhbGVMb3dlckNhc2UoKTtnLmRhdGEoImEtdXNlci1uYXZpZ2F0ZWQtdGV4dCIsayk7Zm9yKHZhciByPWcuY2hpbGRyZW4oKTt1PHIubGVuZ3RoO3UrKyl7dmFyIHc9ci5lcSh1KTtpZigwPT09Yi50cmltKHcudGV4dCgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpLmluZGV4T2Yoaykpe3cuZm9jdXMoKTtnLmRhdGEoImEtdXNlci1uYXZpZ2F0ZWQtaWR4Iix1KTtyZXR1cm59fWcuZGF0YSgiYS11c2VyLW5hdmlnYXRlZC1pZHgiLC0xKTtsPT09aC5TUEFDRSYmZihjLGUsZyl9fX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tc2VsZWN0LWFwaXMiLCJhLWRyb3Bkb3duLWJhc2UtZmFjdG9yeSIsImEtcG9wb3Zlci1iYXNlIikucmVnaXN0ZXIoImEtZHJvcGRvd24tYmFzZSIsZnVuY3Rpb24oYixkLGcsYyl7ZnVuY3Rpb24gayhjLAplLGYpe3RyeXtjLiRldmVudC5wcmV2ZW50RGVmYXVsdCgpfWNhdGNoKGQpe31iLmRlbGF5KGZ1bmN0aW9uKCl7dmFyIGQ9ZS4kYnV0dG9uP2UuJGJ1dHRvbjplLmdldEJ1dHRvbkZyb21FdmVudChjKSxrPWUuJHNlbGVjdD9lLiRzZWxlY3Q6ZS5nZXRTZWxlY3RGcm9tRXZlbnQoYyk7aWYoIWQuaGFzQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIikpe20oayxlKS5pc1N5bmNlZCgpfHxhKGguZXh0ZW5kKHskYnV0dG9uOmQsJHNlbGVjdDprfSxlKSk7dmFyIGw9Yy4kZGVjbGFyYXRpdmVQYXJlbnQsaz1iLmV4dGVuZCh7fSxlLHskYnV0dG9uOmQsJHNvdXJjZVNlbGVjdDprfSkscj1nLmNyZWF0ZShsLGssZik7aWYociYmKHIuc2hvdygpLGQuZGF0YSgiYS1wb3BvdmVyLWlkIixyLmlkKS5kYXRhKCJwb3BvdmVyIixyKS5kYXRhKCJpc1ByZXNzZWQiLCEwKSwhci5oYXNPbkxvYWQpKXtyLmhhc09uTG9hZD0hMDt2YXIgdz1bXSxkPXIuJHBvcG92ZXIuZmluZCgiaW1nIik7ZC5sZW5ndGgmJihkLmVhY2goZnVuY3Rpb24oYSwKZSl7aWYoIWUuY29tcGxldGV8fCFlLm5hdHVyYWxXaWR0aCl7dmFyIGI9aC5EZWZlcnJlZCgpO3cucHVzaChiKTtoKGUpLmJpbmQoImxvYWQgZXJyb3IiLGZ1bmN0aW9uKCl7Yi5yZXNvbHZlKCl9KX19KSx3Lmxlbmd0aD9oLndoZW4uYXBwbHkoaCx3KS5kb25lKGZ1bmN0aW9uKCl7ci51cGRhdGVQb3NpdGlvbigpfSk6ci51cGRhdGVQb3NpdGlvbigpKX19fSl9ZnVuY3Rpb24gZihhKXt2YXIgZT1hLiRidXR0b247YT1hLiRzZWxlY3Q7ZXx8KGU9YS5uZXh0QWxsKCIuYS1idXR0b24tZHJvcGRvd24iKSk7cmV0dXJuIGEubGVuZ3RoPygoZT1nLmdldChlKSkmJmUuaGlkZSgpLCEwKTohMX1mdW5jdGlvbiBhKGEpe3ZhciBlPWEuJGJ1dHRvbjthPWEuJHNlbGVjdDtlfHwoZT1hLm5leHRBbGwoIi5hLWJ1dHRvbi1kcm9wZG93biIpKTtyZXR1cm4gYS5sZW5ndGg/KChlPWcuZ2V0KGUpKSYmZy5yZW1vdmUoZS5pZCksYS5kYXRhKCJhLWluZm8iLG51bGwpLCEwKTohMX1mdW5jdGlvbiBtKGMsCmUpe3ZhciBnO2M9ZS4kc2VsZWN0P2UuJHNlbGVjdDoic3RyaW5nIj09PXR5cGVvZiBjP2goInNlbGVjdCMiK2MpOmMuanF1ZXJ5P2M6aChjKTtpZighYy5sZW5ndGgpcmV0dXJuIG51bGw7Zz1lLiRidXR0b24/ZS4kYnV0dG9uOmUuZ2V0QnV0dG9uRnJvbVNlbGVjdChjKTtjLmRhdGEoImEtc2VsZWN0Iik/ZT1jLmRhdGEoImEtc2VsZWN0Iik6KGU9Yi5leHRlbmQoe2hpZGVQb3BvdmVyOmYscmVmcmVzaFBvcG92ZXI6YSxvcHRpb25zOmIuZXh0ZW5kKHskc2VsZWN0OmMsJGJ1dHRvbjpnfSxlKX0sZCksYy5kYXRhKCJhLXNlbGVjdCIsZSkpO3JldHVybiBlfXZhciBoPWIuJDtyZXR1cm57dG9nZ2xlRHJvcGRvd246ZnVuY3Rpb24oYSxlKXt2YXIgYj0oZS4kYnV0dG9uP2UuJGJ1dHRvbjplLmdldEJ1dHRvbkZyb21FdmVudChhKSkuZGF0YSgicG9wb3ZlciIpO2ImJmIuJHBvcG92ZXIuaXMoIjp2aXNpYmxlIik/Yi5oaWRlKCk6ayhhLGUpfSxzaG93RHJvcGRvd246ayxnZXRTZWxlY3Q6bX19KTsKInVzZSBzdHJpY3QiO2wud2hlbigiQSIsImpRdWVyeSIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLW9wdGlvbnMtYXBpcyIsZnVuY3Rpb24oYixkKXtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uKGIpeyJvYmplY3QiIT09dHlwZW9mIGImJmwuZXJyb3IoImlucHV0IG9mIG9wdGlvbnMudXBkYXRlKCkgZnVuY3Rpb24gbXVzdCBiZSBhIGhhc2giKTt0aGlzLmhpZGVQb3BvdmVyKHRoaXMub3B0aW9ucyk7Zm9yKHZhciBjPTAsZD10aGlzLnNpemUoKTtjPGQ7YysrKXt2YXIgZj10aGlzLm9wdGlvbnMuZWxlbWVudHNbY10sYT1mWzBdO2IudmFsdWUmJmYudmFsKGIudmFsdWUpO3ZvaWQgMCE9PWIuc2VsZWN0ZWQmJighYS5zZWxlY3RlZCYmYi5zZWxlY3RlZD90aGlzLm9wdGlvbnMuJHNlbGVjdC52YWwoYS52YWx1ZSk6YS5zZWxlY3RlZCYmIWIuc2VsZWN0ZWQmJnRoaXMub3B0aW9ucy4kc2VsZWN0LnZhbCgiIikpO2IuaHRtbF9jb250ZW50JiZmLmRhdGEoImEtaHRtbC1jb250ZW50IixiLmh0bWxfY29udGVudCk7CmIuaW1hZ2Vfc291cmNlJiZmLmRhdGEoImEtaW1hZ2Utc291cmNlIixiLmltYWdlX3NvdXJjZSk7Yi5uYXRpdmVfY3NzX2NsYXNzJiYoYS5jbGFzc05hbWU9Yi5uYXRpdmVfY3NzX2NsYXNzKTtiLmNzc19jbGFzcyYmZi5kYXRhKCJhLWNzcy1jbGFzcyIsYi5jc3NfY2xhc3MpO2IubmF0aXZlX2lkJiYoYS5pZD1iLm5hdGl2ZV9pZCk7Yi5pZCYmZi5kYXRhKCJhLWlkIixiLmlkKTtiLnRleHQmJihmLnRleHQoYi50ZXh0KSxhLnNlbGVjdGVkJiZ0aGlzLnNldFNlbGVjdFZhbHVlKGEudmFsdWUpKX10aGlzLnJlZnJlc2hQb3BvdmVyKHRoaXMub3B0aW9ucyk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuaGlkZVBvcG92ZXIodGhpcy5vcHRpb25zKTtmb3IodmFyIGI9MCxjPXRoaXMuc2l6ZSgpO2I8YztiKyspe3ZhciBkPXRoaXMub3B0aW9ucy5lbGVtZW50c1tiXTtkLmlzKCI6c2VsZWN0ZWQiKSYmdGhpcy5zZXRTZWxlY3RWYWx1ZSgiIik7ZC5yZW1vdmUoKX10aGlzLnJlZnJlc2hQb3BvdmVyKHRoaXMub3B0aW9ucyk7CnJldHVybiEwfSxpbmZvOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGM9MCxkPXRoaXMuc2l6ZSgpO2M8ZDtjKyspe3ZhciBmPXRoaXMub3B0aW9ucy5lbGVtZW50c1tjXTtiLnB1c2goe3ZhbHVlOmZbMF0udmFsdWUsdGV4dDpmLnRleHQoKSxzZWxlY3RlZDpmWzBdLnNlbGVjdGVkLGh0bWxfY29udGVudDpmLmRhdGEoImEtaHRtbC1jb250ZW50IiksaW1hZ2Vfc291cmNlOmYuZGF0YSgiYS1pbWFnZS1zb3VyY2UiKSxuYXRpdmVfY3NzX2NsYXNzOmZbMF0uY2xhc3NOYW1lLGNzc19jbGFzczpmLmRhdGEoImEtY3NzLWNsYXNzIiksbmF0aXZlX2lkOmZbMF0uaWQsaWQ6Zi5kYXRhKCJhLWlkIil9KX1yZXR1cm4gYn0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuZWxlbWVudHMubGVuZ3RofX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwialF1ZXJ5IiwiYS1kcm9wZG93bi1vcHRpb25zLWFwaXMiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1zZWxlY3QtYXBpcyIsZnVuY3Rpb24oYiwKZCxnKXtmdW5jdGlvbiBjKGEpe3ZhciBiPXRoaXMub3B0aW9ucy4kc2VsZWN0LGM9dGhpcy5vcHRpb25zLiRidXR0b24sbj1iWzBdOyJudW1iZXIiPT09dHlwZW9mIGEmJihhPWEudG9TdHJpbmcoKSk7Zm9yKHZhciBlPTAsZD1uLm9wdGlvbnMubGVuZ3RoO2U8ZCYmbi5vcHRpb25zW2VdLnZhbHVlIT09YTtlKyspO2U9PT1kJiYiIj09PWEmJihlPTApO2U8ZCYmKGMuZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikuaHRtbChuLm9wdGlvbnNbZV0uaW5uZXJIVE1MKSxjLmNzcygibWluLXdpZHRoIixlL24ub3B0aW9ucy5sZW5ndGgrIiUiKSxiLnZhbCgpIT09YSYmKGIudmFsKGEpLGIudHJpZ2dlcigiY2hhbmdlIixbZiwhMF0pKSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gayhhKXtpZihhPT09ZilyZXR1cm4gdGhpcy5vcHRpb25zLiRzZWxlY3QudmFsKCk7dGhpcy5zZXRWYWx1ZT1jO3JldHVybiB0aGlzLnNldFZhbHVlKGEpfXZhciBmO3JldHVybntpc1N5bmNlZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLm9wdGlvbnMuJHNlbGVjdCxjPWEuZGF0YSgiYS1pbmZvIiksaD10aGlzLmdldE9wdGlvbnMoKS5pbmZvKCk7YS5kYXRhKCJhLWluZm8iLGgpO3JldHVybiBjP2IuZXF1YWxzKGMsaCk6ITB9LHVwZGF0ZTpmdW5jdGlvbihhKXsib2JqZWN0IiE9PXR5cGVvZiBhJiZsLmVycm9yKCJpbnB1dCBvZiBzZWxlY3QudXBkYXRlKCkgZnVuY3Rpb24gbXVzdCBiZSBhbiBvYmplY3QiKTt0aGlzLmhpZGVQb3BvdmVyKHRoaXMub3B0aW9ucyk7dmFyIGI9e25vbmU6ITAsbWljcm86ITAsbWluaTohMCxzbWFsbDohMCxiYXNlOiEwLG1lZGl1bTohMCxsYXJnZTohMCwiZXh0cmEtbGFyZ2UiOiEwLCJkb3VibGUtbGFyZ2UiOiEwLGJsb2NrOiEwfSxjPXRoaXMub3B0aW9ucy4kc2VsZWN0LG49Y1swXSxlPXRoaXMub3B0aW9ucy4kYnV0dG9uLGc9ZVswXSxrPWMuc2libGluZ3MoImxhYmVsIik7YS5uYW1lJiYobi5uYW1lPWEubmFtZSk7aWYoYS5vcHRpb25fcHJvbXB0KXt2YXIgcT1jLmZpbmQoIi5hLXByb21wdCIpOwpxLmxlbmd0aD8ocS50ZXh0KGEub3B0aW9uX3Byb21wdCkscS5wcm9wKCJzZWxlY3RlZCIpJiZlLmZpbmQoIi5hLWRyb3Bkb3duLXByb21wdCIpLnRleHQoYS5vcHRpb25fcHJvbXB0KSk6KGMucHJlcGVuZChkKCJceDNjb3B0aW9uIGNsYXNzXHgzZCdhLXByb21wdCcgL1x4M2UiKS50ZXh0KGEub3B0aW9uX3Byb21wdCkpLGUuZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikudGV4dChhLm9wdGlvbl9wcm9tcHQpKX1hLmhhc19pbWFnZXMhPT1mJiZjLmRhdGEoImEtaGFzLWltYWdlcyIsISFhLmhhc19pbWFnZXMpO2EuYnV0dG9uX3NpemUhPT1mJiZlLmxlbmd0aCYmKCJzbWFsbCI9PT1hLmJ1dHRvbl9zaXplP2UuYWRkQ2xhc3MoImEtYnV0dG9uLXNtYWxsIik6ZS5yZW1vdmVDbGFzcygiYS1idXR0b24tc21hbGwiKSk7YS5zcGFjaW5nIT09ZiYmYi5oYXNPd25Qcm9wZXJ0eShhLnNwYWNpbmcpJiYoYj0vXGJhLXNwYWNpbmctW2Etel0rXGIvZyxuLmNsYXNzTmFtZT1uLmNsYXNzTmFtZS5yZXBsYWNlKGIsCiIiKSxnLmNsYXNzTmFtZT1nLmNsYXNzTmFtZS5yZXBsYWNlKGIsIiIpLGMuYWRkQ2xhc3MoImEtc3BhY2luZy0iK2Euc3BhY2luZyksZS5hZGRDbGFzcygiYS1zcGFjaW5nLSIrYS5zcGFjaW5nKSk7YS5ncmlkX3VuaXRzIT09ZiYmKGI9L1xiYS1idXR0b24tc3BhblxkezEsMn1cYi9nLG4uY2xhc3NOYW1lPW4uY2xhc3NOYW1lLnJlcGxhY2UoYiwiIiksZy5jbGFzc05hbWU9Zy5jbGFzc05hbWUucmVwbGFjZShiLCIiKSxpc0Zpbml0ZShhLmdyaWRfdW5pdHMpJiYwPGEuZ3JpZF91bml0cyYmMTM+YS5ncmlkX3VuaXRzJiYoYy5hZGRDbGFzcygiYS1idXR0b24tc3BhbiIrYS5ncmlkX3VuaXRzKSxlLmFkZENsYXNzKCJhLWJ1dHRvbi1zcGFuIithLmdyaWRfdW5pdHMpKSk7YS53aWR0aF9uYW1lJiYoImJhc2UiPT09YS53aWR0aF9uYW1lZD9lLmFkZENsYXNzKCJhLWJ1dHRvbi13aWR0aC1ub3JtYWwiKTplLnJlbW92ZUNsYXNzKCJhLWJ1dHRvbi13aWR0aC1ub3JtYWwiKSk7aWYoYS5zdGF0dXMpe3ZhciB1PQphLnN0YXR1cyxiPWUuY2xvc2VzdCgiLmEtZHJvcGRvd24tY29udGFpbmVyLCAuYS1zcGxpdGRyb3Bkb3duLWNvbnRhaW5lciIpLmZpbmQoIi5hLWJ1dHRvbiIpLHE9ImVycm9yIj09PXUsdT0iZGlzYWJsZWQiPT09dTtuLmRpc2FibGVkPXU7Yi50b2dnbGVDbGFzcygiYS1idXR0b24tZGlzYWJsZWQiLHUpO3U/Yi5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpOmIucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpO2IudG9nZ2xlQ2xhc3MoImEtYnV0dG9uLWVycm9yIixxKX1hLm5hdGl2ZV9pZCYmKG4uaWQ9YS5uYXRpdmVfaWQsay5sZW5ndGgmJihrWzBdLmh0bWxGb3I9YS5uYXRpdmVfaWQpKTthLmlkJiYoZy5pZD1hLmlkKTthLm5hdGl2ZV9jc3NfY2xhc3MmJigoZz1jLmRhdGEoImEtbmF0aXZlLWNsYXNzIikpJiZjLnJlbW92ZUNsYXNzKGcpLGMuYWRkQ2xhc3MoYS5uYXRpdmVfY3NzX2NsYXNzKS5kYXRhKCJhLW5hdGl2ZS1jbGFzcyIsYS5uYXRpdmVfY3NzX2NsYXNzKSk7YS5jc3NfY2xhc3MmJgooKGc9ZS5kYXRhKCJhLWNsYXNzIikpJiZlLnJlbW92ZUNsYXNzKGcpLGUuYWRkQ2xhc3MoYS5jc3NfY2xhc3MpLmRhdGEoImEtY2xhc3MiLGEuY3NzX2NsYXNzKSk7YS5sYWJlbF90ZXh0IT09ZiYmKCIiPT09YS5sYWJlbF90ZXh0PyhlLmZpbmQoIi5hLWRyb3Bkb3duLWxhYmVsIikucmVtb3ZlKCksYy5zaWJsaW5ncygibGFiZWwiKS5yZW1vdmUoKSk6KGc9ZS5maW5kKCIuYS1kcm9wZG93bi1sYWJlbCIpLGcubGVuZ3RoP2cudGV4dChhLmxhYmVsX3RleHQpOmUuZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikuYmVmb3JlKGQoIlx4M2NzcGFuIGNsYXNzXHgzZCdhLWRyb3Bkb3duLWxhYmVsJyAvXHgzZSIpLnRleHQoYS5sYWJlbF90ZXh0KSksay5sZW5ndGg/ay50ZXh0KGEubGFiZWxfdGV4dCk6Yy5iZWZvcmUoZCgiXHgzY2xhYmVsIGZvclx4M2QnIituLmlkKyInIGNsYXNzXHgzZCdhLW5hdGl2ZS1kcm9wZG93bicgL1x4M2UiKS50ZXh0KGEubGFiZWxfdGV4dCkpKSxlLmNzcygibWluLXdpZHRoIiwKIiI9PT1hLmxhYmVsX3RleHQ/IjAuMSUiOiIwJSIpKTt0aGlzLnJlZnJlc2hQb3BvdmVyKHRoaXMub3B0aW9ucyk7cmV0dXJuIHRoaXN9LHNldFZhbHVlOmMsdmFsOmssZ2V0T3B0aW9uczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLm9wdGlvbnMuJHNlbGVjdCxoPVtdO2E9YT09PWY/Yy5jaGlsZHJlbigib3B0Z3JvdXAsIG9wdGlvbjpub3QoLmEtcHJvbXB0KSIpOmQuaXNBcnJheShhKT9hOlthXTtmb3IodmFyIG49MCxlPWEubGVuZ3RoO248ZTtuKyspe3ZhciBwPWFbbl0sbD1bXTtiLmlzRmluaXRlTnVtYmVyKHApP2w9Yy5jaGlsZHJlbigib3B0Z3JvdXAsIG9wdGlvbjpub3QoLmEtcHJvbXB0KSIpLmVxKHApOiJzdHJpbmciPT09dHlwZW9mIHA/bD1jLmNoaWxkcmVuKCJvcHRpb24jIitwKToib2JqZWN0Ij09PXR5cGVvZiBwJiYobD1wLmpxdWVyeT9wOmQocCkpO2wubGVuZ3RoJiZoLnB1c2gobCl9cmV0dXJuIGIuZXh0ZW5kKHtoaWRlUG9wb3Zlcjp0aGlzLmhpZGVQb3BvdmVyLHJlZnJlc2hQb3BvdmVyOnRoaXMucmVmcmVzaFBvcG92ZXIsCnNldFNlbGVjdFZhbHVlOmssb3B0aW9uczpiLmV4dGVuZCh7ZWxlbWVudHM6aH0sdGhpcy5vcHRpb25zKX0sZyl9LGdldE9wdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPcHRpb25zKGEpfSxhZGRPcHRpb25zOmZ1bmN0aW9uKGEsYil7ZC5pc0FycmF5KGEpfHwoYT1bYV0pO2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KXRoaXMuYWRkT3B0aW9uKGFbY10sYik7cmV0dXJuIHRoaXN9LGFkZE9wdGlvbjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3B0aW9ucy4kc2VsZWN0O2lmKCFhLm5hdGl2ZV9pZHx8IWMuZmluZCgib3B0aW9uIyIrYS5uYXRpdmVfaWQpLmxlbmd0aCl7dmFyIGY9Yy5jaGlsZHJlbigib3B0Z3JvdXAsIG9wdGlvbjpub3QoLmEtcHJvbXB0KSIpLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7Yj1iJiYwPGImJmI8PWYubGVuZ3RoP2I6MDthLm5hdGl2ZV9pZCYmKGUuaWQ9YS5uYXRpdmVfaWQpOzA9PT1mLmxlbmd0aHx8Yj09PWYubGVuZ3RoPwpjWzBdLmFwcGVuZENoaWxkKGUpOmYuZXEoYikuYmVmb3JlKGUpO3RoaXMuZ2V0T3B0aW9uKGUpLnVwZGF0ZShhKX1yZXR1cm4gdGhpc30scmVtb3ZlT3B0aW9uczpmdW5jdGlvbihhKXt0aGlzLmdldE9wdGlvbnMoYSkucmVtb3ZlKCk7cmV0dXJuIHRoaXN9LHJlbW92ZU9wdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmVPcHRpb25zKGEpfSxhcHBlbmRPcHRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkT3B0aW9uKGEsdGhpcy5vcHRpb25zLiRzZWxlY3QuY2hpbGRyZW4oIm9wdGdyb3VwLCBvcHRpb246bm90KC5hLXByb21wdCkiKS5sZW5ndGgpfSxhcHBlbmRPcHRpb25zOmZ1bmN0aW9uKGEpe2lmKGQuaXNBcnJheShhKSlmb3IodmFyIGI9MCxjPWEubGVuZ3RoO2I8YztiKyspdGhpcy5hZGRPcHRpb24oYVtiXSk7cmV0dXJuIHRoaXN9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLWRyb3Bkb3duLW9wdGlvbnMiLCJhLWRyb3Bkb3duLWFwaXMiLCJhLWRyb3Bkb3duLWtleWJvYXJkLWhhbmRsZXJzIikucmVnaXN0ZXIoImEtZHJvcGRvd24iLApmdW5jdGlvbihiLGQsZyxjKXt2YXIgaz1iLiQ7Yz1rKGRvY3VtZW50KTtjLmRlbGVnYXRlKCIuYS1uYXRpdmUtZHJvcGRvd24iLCJjaGFuZ2UiLGZ1bmN0aW9uKGMsYSxtKXt2YXIgaD1kLmdldEJ1dHRvbkZyb21FdmVudChjKSxuPSIiLGU9LTE8dGhpcy5zZWxlY3RlZEluZGV4P3RoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlOiIiLHA9aC5kYXRhKCJwb3BvdmVyIik7Yz0hMTt2YXIgbDtpZihoLmxlbmd0aCl7Zm9yKHZhciBoPWguZXEoMCkscT10aGlzLmxlbmd0aDtxLS07KWlmKGw9dGhpcy5vcHRpb25zW3FdLGwudmFsdWU9PT1lKXtuPWwuaW5uZXJIVE1MO2JyZWFrfXAmJnAuJHBvcG92ZXImJihwLiRwb3BvdmVyLmZpbmQoIi5hLWFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhLWFjdGl2ZSIpLmNsb3Nlc3QoImxpIikuYXR0cigiYXJpYS1jaGVja2VkIiwhMSksdm9pZCAwPT09YSYmKGE9SlNPTi5zdHJpbmdpZnkoe3N0cmluZ1ZhbDplfSksYT1wLiRwb3BvdmVyLmZpbmQoJ2FbZGF0YS12YWx1ZVx4M2QiJysKYi5lc2NhcGVKcXVlcnlTZWxlY3RvcihhKSsnIl0nKSkpO2EmJmEubGVuZ3RoJiYoYz0hMCxhLmFkZENsYXNzKCJhLWFjdGl2ZSIpLmNsb3Nlc3QoImxpIikuYXR0cigiYXJpYS1jaGVja2VkIiwhMCkpO2guZmluZCgiLmEtZHJvcGRvd24tcHJvbXB0IikuaHRtbChuKTtoLmNzcygibWluLXdpZHRoIix0aGlzLnNlbGVjdGVkSW5kZXgvdGhpcy5vcHRpb25zLmxlbmd0aCsiJSIpO3AmJihwLmhpZGUoKSwoaD1nLmdldFNlbGVjdCh0aGlzKSkmJmsodGhpcykuZGF0YSgiYS1pbmZvIixoLmdldE9wdGlvbnMoKS5pbmZvKCkpKTttfHwobT10aGlzLm5hbWUsaD10aGlzLmlkLGE9e2F1aUl0ZW1Ob2RlOmM/YVswXTpudWxsLG5hdGl2ZUl0ZW1Ob2RlOnRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLHNlbGVjdE5vZGU6dGhpcyxpZDpoLG5hbWU6bSx2YWx1ZTp0aGlzLnZhbHVlfSxtJiYiIiE9PW0mJihiLnRyaWdnZXIoImE6ZHJvcGRvd246IittKyI6c2VsZWN0IixhKSxiLnRyaWdnZXIoImE6ZHJvcGRvd246c2VsZWN0ZWQ6IisKbSxhKSksaCYmIiIhPT1oJiZiLnRyaWdnZXIoImE6ZHJvcGRvd246IitoKyI6c2VsZWN0IixhKSxiLnRyaWdnZXIoImE6ZHJvcGRvd246c2VsZWN0IixhKSl9fSk7Yy5kZWxlZ2F0ZSgiLmEtYnV0dG9uLWRyb3Bkb3duOm5vdCguYS1idXR0b24tZGlzYWJsZWQpIiwiZm9jdXNpbiIsZnVuY3Rpb24oKXtrKHRoaXMpLmZpbmQoIi5hLWJ1dHRvbi10ZXh0IikuZm9jdXMoKX0pO3JldHVybiBnfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZSIsImEtZHJvcGRvd24tb3B0aW9ucyIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLWFwaXMiLGZ1bmN0aW9uKGIsZCxnKXtmdW5jdGlvbiBjKGIpe3JldHVybiBkLmdldFNlbGVjdChiLGcpfXZhciBrPWIuJDtiLm9uKCJiZWZvcmVSZWFkeSIsZnVuY3Rpb24oKXtrKCIuYS1kcm9wZG93bi1jb250YWluZXIgc2VsZWN0IikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWModGhpcyk7YiYmYi52YWwoYi52YWwoKSl9KX0pO3JldHVybntnZXRTZWxlY3Q6YywKdXBkYXRlT3B0aW9uOmZ1bmN0aW9uKGIsYSl7dmFyIGc9aygib3B0aW9uIyIrYikuY2xvc2VzdCgic2VsZWN0Iik7YyhnKS5nZXRPcHRpb24oYikudXBkYXRlKGEpfSx1cGRhdGVTZWxlY3Q6ZnVuY3Rpb24oYixhKXtjKGIpLnVwZGF0ZShhKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYixhKXtjKGIpLnNldFZhbHVlKGEpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHkiKS5yZWdpc3RlcigiYS1kcm9wZG93bi12aWV3IixmdW5jdGlvbihiLGQpe3JldHVybntza2luOmZ1bmN0aW9uKGIpe3ZhciBjPWIuYXR0cnMoImhlYWRlciIpfHwiIjtiPXtpZDpiLmlkLGhlYWRlcl9zdHI6YyxuZWVkc19kZWNsYXJhdGl2ZTohMX07cmV0dXJuWydceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXIgYS1kcm9wZG93biBhLWRyb3Bkb3duLWNvbW1vbiBhLWRlY2xhcmF0aXZlIiBkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWExMXkiXHgzZScsZC5nZXRTdGFydEFuY2hvckh0bWwoYiksCidceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItd3JhcHBlciJceDNlXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWlubmVyIlx4M2VceDNjL2Rpdlx4M2VceDNjL2Rpdlx4M2UnLGQuZ2V0RW5kQW5jaG9ySHRtbChiKSwiXHgzYy9kaXZceDNlIl0uam9pbigiIil9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLWRyb3Bkb3duLWJhc2UiLCJhLWRyb3Bkb3duLXZpZXciLCJhLWRyb3Bkb3duLW9wdGlvbnMiLCJhLWRyb3Bkb3duLWFwaXMiLCJhLWRyb3Bkb3duLWJhc2UtZmFjdG9yeSIsImEtZHJvcGRvd24ta2V5Ym9hcmQtaGFuZGxlcnMiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1oYW5kbGVycyIsZnVuY3Rpb24oYixkLGcsYyxrLGYsYSl7dmFyIG09Yi4kO2s9bShkb2N1bWVudCk7Yi5kZWNsYXJhdGl2ZSgiYS1kcm9wZG93bi1idXR0b24iLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIGY9Yy5nZXRCdXR0b25Gcm9tRXZlbnQoYSk7ZC5zaG93RHJvcGRvd24oYSxiLmV4dGVuZCh7JGJ1dHRvbjpmfSwKYyksZyl9KTtiLmRlY2xhcmF0aXZlKCJhLWRyb3Bkb3duLWJ1dHRvbiIsImtleWRvd24iLGZ1bmN0aW9uKGEpe3ZhciBmPWMuZ2V0QnV0dG9uRnJvbUV2ZW50KGEpLGU9Yi5jb25zdGFudHMua2V5Y29kZXMsaz1hLiRldmVudC53aGljaDtrIT09ZS5ET1dOX0FSUk9XJiZrIT09ZS5FTlRFUiYmayE9PWUuU1BBQ0V8fGQuc2hvd0Ryb3Bkb3duKGEsYi5leHRlbmQoeyRidXR0b246Zn0sYyksZyl9KTtrLmRlbGVnYXRlKCIuYS1wb3BvdmVyLmEtZHJvcGRvd24gYSIsImNsaWNrIixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCk7YT1tKHRoaXMpO3ZhciBiPWYuZ2V0KGEuY2xvc2VzdCgiLmEtcG9wb3ZlciIpKTtpZihhLmhhc0NsYXNzKCJhLWFjdGl2ZSIpKWIuaGlkZSgpO2Vsc2V7dmFyIGU9YS5kYXRhKCJ2YWx1ZSIpLnN0cmluZ1ZhbDtiLnNvdXJjZVNlbGVjdC52YWwoZSkudHJpZ2dlcigiY2hhbmdlIixbYV0pfX0pO2EmJihhLmtleURvd24mJmsuZGVsZWdhdGUoIi5hLWRyb3Bkb3duIGxpIiwKImtleWRvd24iLGEua2V5RG93biksYS5rZXlQcmVzcyYmay5kZWxlZ2F0ZSgiLmEtZHJvcGRvd24gbGkiLCJrZXlwcmVzcyIsYS5rZXlQcmVzcykpfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIpLnJlZ2lzdGVyKCJhLWRyb3Bkb3duLW9wdGlvbnMiLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoYil7cmV0dXJuIGIucG9wb3Zlcj9iLnBvcG92ZXIuJHRyaWdnZXIuY2xvc2VzdCgiLmEtYnV0dG9uLWRyb3Bkb3duIik6Yi4kdGFyZ2V0P2IuJHRhcmdldC5jbG9zZXN0KCIuYS1idXR0b24tZHJvcGRvd24iKTpnKGIudGFyZ2V0KS5uZXh0QWxsKCIuYS1idXR0b24tZHJvcGRvd24iKX12YXIgZz1iLiQ7cmV0dXJue2dldEJ1dHRvbkZyb21FdmVudDpkLGdldEJ1dHRvbkZyb21TZWxlY3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGIubmV4dEFsbCgiLmEtYnV0dG9uLWRyb3Bkb3duIil9LGdldFNlbGVjdEZyb21FdmVudDpmdW5jdGlvbihiKXtiPWQoYikucHJldkFsbCgic2VsZWN0IikuZXEoMCk7Yi5sZW5ndGh8fApsLmVycm9yKCJDYW5ub3QgbG9jYXRlIHRoZSBceDNjc2VsZWN0XHgzZSBvZiBkcm9wZG93biIpO3JldHVybiBifSx0cmlnZ2VyU2VsZWN0b3I6Ii5hLWJ1dHRvbi1kcm9wZG93biJ9fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci1hY2Nlc3NpYmlsaXR5IikucmVnaXN0ZXIoImEtZHJvcGRvd24tc3BsaXQtdmlldyIsZnVuY3Rpb24oYixkKXtyZXR1cm57c2tpbjpmdW5jdGlvbihiKXt2YXIgYz1iLmF0dHJzKCJoZWFkZXIiKXx8IiI7Yj17aWQ6Yi5pZCxsYWJlbF9zdHI6YyxuZWVkc19kZWNsYXJhdGl2ZTohMX07cmV0dXJuWydceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXIgYS1zcGxpdGRyb3Bkb3duIGEtZHJvcGRvd24tY29tbW9uIGEtZGVjbGFyYXRpdmUiIGRhdGEtYWN0aW9uXHgzZCJhLXBvcG92ZXItYTExeSJceDNlJyxkLmdldFN0YXJ0QW5jaG9ySHRtbChiKSwnXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLXdyYXBwZXIiXHgzZVxuXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWlubmVyIlx4M2VceDNjL2Rpdlx4M2Vcblx4M2MvZGl2XHgzZScsCmQuZ2V0RW5kQW5jaG9ySHRtbChiKSwiXHgzYy9kaXZceDNlIl0uam9pbigiXG4iKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZSIsImEtZHJvcGRvd24tc3BsaXQtdXRpbHMiLCJhLWRyb3Bkb3duLXNwbGl0LXZpZXciLCJhLWRyb3Bkb3duLXNwbGl0LW9wdGlvbnMiLCJhLWRyb3Bkb3duLWJhc2UtZmFjdG9yeSIsImEtZHJvcGRvd24ta2V5Ym9hcmQtaGFuZGxlcnMiKS5yZWdpc3RlcigiYS1kcm9wZG93bi1zcGxpdC1oYW5kbGVycyIsZnVuY3Rpb24oYixkLGcsYyxrLGYsYSl7dmFyIG09Yi4kO2IuZGVjbGFyYXRpdmUoImEtc3BsaXRkcm9wZG93bi1idXR0b24iLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIGY9ay5nZXRCdXR0b25Gcm9tRXZlbnQoYSk7ZC5zaG93RHJvcGRvd24oYSxiLmV4dGVuZCh7JGJ1dHRvbjpmfSxrKSxjKX0pO2IuZGVjbGFyYXRpdmUoImEtc3BsaXRkcm9wZG93bi1tYWluIiwiY2xpY2siLGZ1bmN0aW9uKGEpe3ZhciBiPWEuJHRhcmdldC5jbG9zZXN0KCIuYS1zcGxpdGRyb3Bkb3duLWNvbnRhaW5lciIpLmZpbmQoInNlbGVjdCIpLAplPWIuYXR0cigiaWQiKSxjPWIudmFsKCk7Zy50cmlnZ2VyRXZlbnQoZSxiLGMpO2EuJGV2ZW50LnByZXZlbnREZWZhdWx0KCl9KTtiLmRlY2xhcmF0aXZlKCJhLXNwbGl0ZHJvcGRvd24tYnV0dG9uIiwia2V5ZG93biIsZnVuY3Rpb24oYSl7dmFyIGY9ay5nZXRCdXR0b25Gcm9tRXZlbnQoYSksZT1iLmNvbnN0YW50cy5rZXljb2RlcyxnPWEuJGV2ZW50LndoaWNoO2chPT1lLkRPV05fQVJST1cmJmchPT1lLkVOVEVSJiZnIT09ZS5TUEFDRXx8ZC5zaG93RHJvcGRvd24oYSxtLmV4dGVuZCh7JGJ1dHRvbjpmfSxrKSxjKX0pO20oZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1wb3BvdmVyLmEtc3BsaXRkcm9wZG93biBhIiwiY2xpY2siLGZ1bmN0aW9uKGEpe3ZhciBiPW0odGhpcyksZT1iLmRhdGEoInZhbHVlIikuc3RyaW5nVmFsLGI9Zi5nZXQoYi5jbG9zZXN0KCIuYS1wb3BvdmVyIikpLGM9Yi5zb3VyY2VTZWxlY3QsZD1jLmF0dHIoImlkIik7Yi5oaWRlKCk7Zy50cmlnZ2VyRXZlbnQoZCwKYyxlKTthLnByZXZlbnREZWZhdWx0KCl9KS5kZWxlZ2F0ZSgiLmEtc3BsaXRkcm9wZG93biBsaSIsImtleWRvd24iLGEua2V5RG93bikuZGVsZWdhdGUoIi5hLXNwbGl0ZHJvcGRvd24gbGkiLCJrZXlwcmVzcyIsYS5rZXlQcmVzcyl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIikucmVnaXN0ZXIoImEtZHJvcGRvd24tc3BsaXQtb3B0aW9ucyIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChiKXtyZXR1cm4gYi5wb3BvdmVyP2IucG9wb3Zlci4kdHJpZ2dlci5jbG9zZXN0KCIuYS1idXR0b24tc3BsaXRkcm9wZG93biIpOmIuJHRhcmdldD9iLiR0YXJnZXQuY2xvc2VzdCgiLmEtYnV0dG9uLXNwbGl0ZHJvcGRvd24iKTpnKGIudGFyZ2V0KS5uZXh0QWxsKCIuYS1idXR0b24tc3BsaXRkcm9wZG93biIpfXZhciBnPWIuJDtyZXR1cm57Z2V0QnV0dG9uRnJvbUV2ZW50OmQsZ2V0QnV0dG9uRnJvbVNlbGVjdDpmdW5jdGlvbihiKXtyZXR1cm4gYi5uZXh0KCIuYS1idXR0b24tZ3JvdXAtc3BsaXRkcm9wZG93biIpLmZpbmQoIi5hLWJ1dHRvbi1zcGxpdGRyb3Bkb3duIil9LApnZXRTZWxlY3RGcm9tRXZlbnQ6ZnVuY3Rpb24oYil7Yj1kKGIpLmNsb3Nlc3QoIi5hLXNwbGl0ZHJvcGRvd24tY29udGFpbmVyIikuZmluZCgic2VsZWN0Iik7Yi5sZW5ndGh8fGwuZXJyb3IoImNhbm5vdCBsb2NhdGUgdGhlIFx4M2NzZWxlY3RceDNlIG9mIHRoZSBzcGxpdCBkcm9wZG93biIpO3JldHVybiBifX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIikucmVnaXN0ZXIoImEtZHJvcGRvd24tc3BsaXQtdXRpbHMiLGZ1bmN0aW9uKGIpe3JldHVybnt0cmlnZ2VyRXZlbnQ6ZnVuY3Rpb24oZCxnLGMpe2c9eyRzZWxlY3Q6Zyx2YWx1ZTpjLGlkOmR9O2IudHJpZ2dlcigiYTpzcGxpdGRyb3Bkb3duOiIrZCsiOnNlbGVjdCIsZyk7Yi50cmlnZ2VyKCJhOnNwbGl0ZHJvcGRvd246c2VsZWN0IixnKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtZHJvcGRvd24tYmFzZSIsImEtZHJvcGRvd24tc3BsaXQtb3B0aW9ucyIsImEtZHJvcGRvd24tc3BsaXQtdXRpbHMiLCJhLWRyb3Bkb3duLXNwbGl0LWhhbmRsZXJzIikucmVnaXN0ZXIoImEtc3BsaXRkcm9wZG93biIsCmZ1bmN0aW9uKGIsZCxnLGMsayl7dmFyIGY9Yi4kO2YoZG9jdW1lbnQpLmRlbGVnYXRlKCIuYS1uYXRpdmUtc3BsaXRkcm9wZG93biIsImNoYW5nZSIsZnVuY3Rpb24oYSxiLGgpe2E9Zih0aGlzKTtiPWEudmFsKCk7dmFyIGQ9YS5hdHRyKCJpZCIpO2h8fGMudHJpZ2dlckV2ZW50KGQsYSxiKX0pLmRlbGVnYXRlKCIuYS1idXR0b24tc3BsaXRkcm9wZG93bjpub3QoLmEtYnV0dG9uLWRpc2FibGVkKSIsImZvY3VzaW4iLGZ1bmN0aW9uKCl7Zih0aGlzKS5maW5kKCIuYS1idXR0b24tdGV4dCIpLmZvY3VzKCl9KTtyZXR1cm57Z2V0U2VsZWN0OmZ1bmN0aW9uKGEpe3JldHVybiBkLmdldFNlbGVjdChhLGcpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHktdGVtcGxhdGVzIikucmVnaXN0ZXIoImEtcG9wb3Zlci1hY2Nlc3NpYmlsaXR5IixmdW5jdGlvbihiLGQpe3ZhciBnPWQuc3RhcnRBbmNob3JUZW1wbGF0ZSxjPWQuc3RhcnRBbmNob3JEZWNsYXJhdGl2ZVRlbXBsYXRlLAprPWQuZW5kQW5jaG9yVGVtcGxhdGUsZj1kLmRlc2NyaXB0aW9uVGVtcGxhdGUsYT1mdW5jdGlvbihhLGIpe3ZhciBlPXsie3tERVNDUklQVElPTn19IjpiLCJ7e0RFU0NSSVBUSU9OX0lEfX0iOmF9O3JldHVybiBmLnJlcGxhY2UoL1x7XHtbXHdfXSpcfVx9L2csZnVuY3Rpb24oYSl7cmV0dXJuIGVbYV19KX0sbT1mdW5jdGlvbihhKXt2YXIgYj1hLmlkLGU9YS5oZWFkZXJfc3RyO3JldHVybihhPWEubGFiZWxfc3RyKT8nYXJpYS1sYWJlbFx4M2QiJythKyciJzplPydhcmlhLWxhYmVsbGVkYnlceDNkImEtcG9wb3Zlci1oZWFkZXItJytiKyciJzoiIn07cmV0dXJue2dldFN0YXJ0QW5jaG9ySHRtbDpmdW5jdGlvbihoKXt2YXIgZj1oLmlkLGU9aC5sYWJlbF9zdHIsZD1oLmFyaWFfZGVzY3JpcHRpb24saz0iIjtpZighZilyZXR1cm4iIjt2YXIgbD17Int7Uk9MRX19Ijoncm9sZVx4M2QiZGlhbG9nIicsInt7QU5DSE9SX05BTUV9fSI6ImEtcG9wb3Zlci1zdGFydCIsInt7QVJJQV9MQUJFTH19IjptKGgpLAoie3tMQUJFTF9TVFJ9fSI6ZXx8IiIsInt7QVJJQV9ERVNDUklCRURCWX19IjoiIn07aD1oLm5lZWRzX2RlY2xhcmF0aXZlP2M6ZztkJiYhYi5jYXBhYmlsaXRpZXMuaW9zJiYoZj0iYS1wb3BvdmVyLWFyaWEtZGVzY3JpcHRpb24tIitmLGxbInt7QVJJQV9ERVNDUklCRURCWX19Il09J2FyaWEtZGVzY3JpYmVkYnlceDNkIicrZisnIicsaz1hKGYsZCkpO2IuY2FwYWJpbGl0aWVzLmlvcyYmKGxbInt7Uk9MRX19Il09IiIpO2g9aC5yZXBsYWNlKC9ce1x7W1x3X10qXH1cfS9nLGZ1bmN0aW9uKGEpe3JldHVybiBsW2FdfSkraztiLmNhcGFiaWxpdGllcy5pb3MmJihoPWgucmVwbGFjZSgvc3Bhbi9nLCJidXR0b24iKSk7cmV0dXJuIGgucmVwbGFjZSgvXHNccz58XHM+L2csIlx4M2UiKX0sZ2V0RW5kQW5jaG9ySHRtbDpmdW5jdGlvbihhKXthPWs7Yi5jYXBhYmlsaXRpZXMuaW9zJiYoYT1hLnJlcGxhY2UoL3NwYW4vZywiYnV0dG9uIikpO3JldHVybiBhfX19KTsidXNlIHN0cmljdCI7bC5kZWNsYXJlKCJhLXBvcG92ZXItYWNjZXNzaWJpbGl0eS10ZW1wbGF0ZXMiLAp7c3RhcnRBbmNob3JUZW1wbGF0ZTonXHgzY3NwYW4gdGFiaW5kZXhceDNkIjAiIHJvbGVceDNkImRpYWxvZyIgY2xhc3NceDNkInt7QU5DSE9SX05BTUV9fSBhLXBvcG92ZXItYTExeS1vZmZzY3JlZW4iIHt7QVJJQV9MQUJFTH19IHt7QVJJQV9ERVNDUklCRURCWX19XHgzZVx4M2Mvc3Bhblx4M2UnLHN0YXJ0QW5jaG9yRGVjbGFyYXRpdmVUZW1wbGF0ZTonXHgzY3NwYW4gdGFiaW5kZXhceDNkIjAiIHJvbGVceDNkImRpYWxvZyIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1hMTF5IiBjbGFzc1x4M2Qie3tBTkNIT1JfTkFNRX19IGEtcG9wb3Zlci1hMTF5LW9mZnNjcmVlbiBhLWRlY2xhcmF0aXZlIiB7e0FSSUFfTEFCRUx9fSB7e0FSSUFfREVTQ1JJQkVEQll9fVx4M2V7e0xBQkVMX1NUUn19XHgzYy9zcGFuXHgzZScsZW5kQW5jaG9yVGVtcGxhdGU6J1x4M2NzcGFuIHRhYmluZGV4XHgzZCIwIiBjbGFzc1x4M2QiYS1wb3BvdmVyLWVuZCBhLXBvcG92ZXItYTExeS1vZmZzY3JlZW4iXHgzZVx4M2Mvc3Bhblx4M2UnLApkZXNjcmlwdGlvblRlbXBsYXRlOidceDNjc3BhbiBpZFx4M2Qie3tERVNDUklQVElPTl9JRH19IiBjbGFzc1x4M2QiYS1wb3BvdmVyLWExMXktb2Zmc2NyZWVuIlx4M2V7e0RFU0NSSVBUSU9OfX1ceDNjL3NwYW5ceDNlJ30pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItdXRpbCIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYWpheCIsZnVuY3Rpb24oYixkKXtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZj17fTtmLnVybD1jO2QudGltZW91dCYmKGYudGltZW91dD1kLnRpbWVvdXQpO2QuYWpheEZhaWxNc2cmJihmLmFqYXhGYWlsTXNnPWQuYWpheEZhaWxNc2cpO2QuY2FjaGUmJihmLmNhY2hlPWQuY2FjaGUpO2IudXBkYXRlKGYpfSxzaG93U3Bpbm5lcjpmdW5jdGlvbihiKXtyZXR1cm4gZC5zaG93U3Bpbm5lcihiKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItYW5pbWF0ZSIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChjLApkKXtyZXR1cm4gZnVuY3Rpb24oKXtiW2NdLmFwcGx5KGIsZCl9fWZ1bmN0aW9uIGcoYixkKXtyZXR1cm4gZnVuY3Rpb24oKXtiLl9pc0FuaW1hdGluZz0hMTtkJiZkKCl9fXJldHVybntpc0FuaW1hdGluZzpmdW5jdGlvbihiKXtyZXR1cm4gYi5faXNBbmltYXRpbmd9LGFuaW1hdGU6ZnVuY3Rpb24oYyxrLGYsYSxtKXtjLl9pc0FuaW1hdGluZz0wPGY7Yi5hbmltYXRpb25GcmFtZURlbGF5KGQoImFuaW1hdGUiLFtjLiRwb3BvdmVyLGssZixhLGcoYyxtKV0pKX0sZmFkZU91dDpmdW5jdGlvbihjLGssZixhKXtjLl9pc0FuaW1hdGluZz0wPGs7Yi5hbmltYXRpb25GcmFtZURlbGF5KGQoImZhZGVPdXQiLFtjLiRwb3BvdmVyLGssZixnKGMsYSldKSl9LGZhZGVJbjpmdW5jdGlvbihjLGssZixhKXtjLl9pc0FuaW1hdGluZz0wPGs7Yi5hbmltYXRpb25GcmFtZURlbGF5KGQoImZhZGVJbiIsW2MuJHBvcG92ZXIsayxmLGcoYyxhKV0pKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci11dGlsIiwKImEtcG9wb3Zlci1pbmxpbmUtc3RyYXRlZ3kiLCJhLXBvcG92ZXItcHJlbG9hZC1zdHJhdGVneSIsImEtcG9wb3Zlci1hamF4LXN0cmF0ZWd5IikucmVnaXN0ZXIoImEtcG9wb3Zlci1kYXRhIixmdW5jdGlvbihiLGQsZyxjLGspe3ZhciBmPVtrLGMsZ107cmV0dXJue2d1ZXNzU3RyYXRlZ3lCeUF0dHJzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9Zi5sZW5ndGg7YjxjO2IrKyl7dmFyIGQ9ZltiXTtpZihkLmlzVmFsaWRTdHJhdGVneShhKSlyZXR1cm4gZH19LGdldFN0cmF0ZWd5QnlOYW1lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9Zi5sZW5ndGg7YjxjO2IrKyl7dmFyIGQ9ZltiXTtpZihkLm5hbWU9PT1hKXJldHVybiBkfXJldHVybiBudWxsfSxzaG93U3Bpbm5lcjpkLnNob3dTcGlubmVyfX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItbGlnaHRib3gtbWFya3VwIiwiYS10aW1pbmctYW5hbHl0aWNzIiwicmVhZHkiKS5yZWdpc3RlcigiYS1wb3BvdmVyLWxpZ2h0Ym94IiwKZnVuY3Rpb24oYixkLGcpe2Z1bmN0aW9uIGMoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2Euc3RvcFByb3BhZ2F0aW9uKCk7YS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtyZXR1cm4hMX1mdW5jdGlvbiBrKCl7dS51bmJpbmQoImNsaWNrIixjKTtxPSExfWZ1bmN0aW9uIGYoZSl7dmFyIGQ9YSh0KTstMTx3fHwhcnx8KGU9ZXx8e30sdS5iaW5kKCJjbGljayIsYykscT0hMCwibnVtYmVyIiE9PXR5cGVvZiBlLmhpZGVEdXJhdGlvbiYmKGUuaGlkZUR1cmF0aW9uPTI1MCksMDxlLmhpZGVEdXJhdGlvbj9iLmZhZGVPdXQocixlLmR1cmF0aW9uLCJsaW5lYXIiLGZ1bmN0aW9uKCl7ZS5sb2NrU2Nyb2xsJiYoYSgiaHRtbCwgYm9keSIpLmNzcygib3ZlcmZsb3ciLCIiKSxhKCJib2R5IikuY3NzKCJtYXJnaW4tcmlnaHQiLCIiKSxiLmRlbGF5KGZ1bmN0aW9uKCl7MDx4JiYoZC5zY3JvbGxUb3AoeCkseD0tMSk7MDx6JiYoZC5zY3JvbGxMZWZ0KHopLHo9LTEpfSwxMDApKTt5PW51bGx9KTooci5jc3MoImRpc3BsYXkiLAoibm9uZSIpLGUubG9ja1Njcm9sbCYmKGEoImh0bWwsIGJvZHkiKS5jc3MoIm92ZXJmbG93IiwiIiksYSgiYm9keSIpLmNzcygibWFyZ2luLXJpZ2h0IiwiIiksMDx4JiYoZC5zY3JvbGxUb3AoeCkseD0tMSkpLHk9bnVsbCksci5jc3Moe2hlaWdodDoiIix3aWR0aDoiIn0pLGIuZGVsYXkoayxlLmhpZGVEdXJhdGlvbiszNTApLGEoIiNhLXBhZ2UiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpKX12YXIgYT1iLiQsbT0tMTxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoIi1pZSIpLGg9Yi5jYXBhYmlsaXRpZXMuaXNJRTEwUGx1cyYmYi5jYXBhYmlsaXRpZXMubW9iaWxlLG49MD09PShiLmNhcGFiaWxpdGllcy5hbmRyb2lkVmVyc2lvbisiIikuaW5kZXhPZigiNC4iKSxlPWIuY2FwYWJpbGl0aWVzLmlzVUNCcm93c2VyLHA9ZC5pZCxsPWQuZGl2LHE9ITEsdT1hKCJib2R5Iikscj1udWxsLHc9LTEseD0tMSx6PS0xLHk9bnVsbDthKGRvY3VtZW50KS5kZWxlZ2F0ZSgiIyIrCnAsImNsaWNrICIrYi5hY3Rpb24uc3RhcnQrIiAiK2IuYWN0aW9uLm1vdmUsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyLWZsb2F0aW5nLWNsb3NlIixiLmNhcGFiaWxpdGllcy50b3VjaD9iLmFjdGlvbi5lbmQ6ImNsaWNrIixmdW5jdGlvbihhKXshcSYmYS4kdGFyZ2V0LmRhdGEoImFjdGlvbiIpJiYtMTxhLiR0YXJnZXQuZGF0YSgiYWN0aW9uIikuaW5kZXhPZigiYS1wb3BvdmVyLWZsb2F0aW5nLWNsb3NlIikmJih5JiZ5LmlzQWN0aXZlKCk/KHkudW5sb2NrKCkuaGlkZSgpLGEuJGV2ZW50LnByZXZlbnREZWZhdWx0KCkpOmYoKSl9KTtpZihiLmNhcGFiaWxpdGllcy5pc2lPUzgpYi5vbigiYTpwb3BvdmVyOmFmdGVyVXBkYXRlUG9zaXRpb24iLGZ1bmN0aW9uKGIpe2I9Yi5wb3BvdmVyO3ZhciBlPWEoIiMiK3ApLGM9ZS5sZW5ndGg/ZS5vZmZzZXQoKS50b3A6LTEsZD1hKHQpLGYsaDtiLmlzQWN0aXZlKCkmJmIuYXR0cnMoImxpZ2h0Ym94T3B0aW9ucyIpJiYKYyYmKGY9MCxoPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZC5zY3JvbGxUb3AoYyk7NTwrK2YmJmNsZWFySW50ZXJ2YWwoaCl9LDIwMCkpfSk7Zy5zdG9wV2lkZ2V0TG9nZ2luZygiZHJvcGRvd24iKTtyZXR1cm57c2hvdzpmdW5jdGlvbihkKXthKCIjYS1wYWdlIikuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIik7dmFyIGY9YSh0KTtyfHwoYSgiYm9keSIpLmFwcGVuZChsKSxyPWEoIiMiK3ApKTtkPWR8fHt9O3UuYmluZCgiY2xpY2siLGMpO3E9ITA7ZC5sb2NrU2Nyb2xsJiYoLTE9PT14JiYoeD1mLnNjcm9sbFRvcCgpLHo9Zi5zY3JvbGxMZWZ0KCkpLGIuc2V0Q3NzSW1wb3J0YW50KGEoImJvZHkiKSwibWFyZ2luLXJpZ2h0IixiLnNjcm9sbEJhcldpZHRoKCkrInB4IiksaHx8KG0/YSgiaHRtbCwgYm9keSIpLmNzcygib3ZlcmZsb3ciLCJoaWRkZW4iKTphKCJib2R5IikuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpKSk7dmFyIGc9KHk9ZC5wb3BvdmVyfHxudWxsKT95LiRwb3BvdmVyLmNzcygiei1pbmRleCIpLQoyOi0xOzA8ZyYmKHIuY3NzKCJ6LWluZGV4IixnKSxuJiZmLndpZHRoKCkpOyJudW1iZXIiIT09dHlwZW9mIGQuc2hvd0R1cmF0aW9uJiYoZC5zaG93RHVyYXRpb249MjAwKTtlJiZ5LiRwb3BvdmVyLmNzcygib3ZlcmZsb3ciLCJhdXRvIik7MDxkLnNob3dEdXJhdGlvbj9iLmZhZGVJbihyLGQuc2hvd0R1cmF0aW9uKTpyLmNzcygiZGlzcGxheSIsImJsb2NrIik7Yi5kZWxheShrLGQuc2hvd0R1cmF0aW9uKzMwMCl9LGhpZGU6Zixsb2NrOmZ1bmN0aW9uKGEpe2F8fChhPTEwKTt3PGEmJih3PWEpfSx1bmxvY2s6ZnVuY3Rpb24oYSl7YXx8KGE9MTApO3c8PWEmJih3PS0xKX0sTElHSFRCT1hfSUQ6cH19KTtsLmRlY2xhcmUoImEtcG9wb3Zlci1saWdodGJveC1tYXJrdXAiLHtpZDoiYS1wb3BvdmVyLWxndGJveCIsZGl2OidceDNjZGl2IGlkXHgzZCJhLXBvcG92ZXItbGd0Ym94IiBjbGFzc1x4M2QiYS1kZWNsYXJhdGl2ZSIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1mbG9hdGluZy1jbG9zZSIgL1x4M2UnfSk7CiJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJyZWFkeSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItbmF2aWdhdGUiLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoYSl7InN0cmluZyI9PT10eXBlb2YgYSYmKGY9ITAsdC5sb2NhdGlvbi5oYXNoPWEpO3JldHVybiB0LmxvY2F0aW9uLmhhc2h8fCIifXZhciBnPWIuJCxnPWcodCksYz1bXSxrPVtdLGY9ITEsYT17fSxtPSExO2sucHVzaChkKCkpO2cuYmluZCgiaGFzaGNoYW5nZSIsZnVuY3Rpb24oYyl7Yy5wcmV2ZW50RGVmYXVsdCgpO20/bT0hMTprLnB1c2goZCgpKTszMjw9ay5sZW5ndGgmJmsuc2hpZnQoKTtmP2Y9ITE6Yi50cmlnZ2VyKCJhOnBvcG92ZXI6bmF2aWdhdGUiLGFba1trLmxlbmd0aC0xXV0pfSk7Yi5vbigiYTpwb3BvdmVyOm5hdmlnYXRlIixmdW5jdGlvbihhKXthP2Euc2hvdyh7cHJldmVudE5hdmlnYXRlOiEwfSk6KGE9MDw9Yy5sZW5ndGgtMT9jW2MubGVuZ3RoLTFdOm51bGwpJiZhLnVubG9jaygpLmhpZGUoe3ByZXZlbnROYXZpZ2F0ZTohMH0pfSk7CmIub24oImE6cG9wb3ZlcjpzaG93TmF2aWdhYmxlIGE6cG9wb3ZlcjpzaG93TmF2aWdhYmxlTGVnYWN5IixmdW5jdGlvbihhKXtjLnB1c2goYS5wb3BvdmVyKX0pO2Iub24oImE6cG9wb3ZlcjpoaWRlTmF2aWdhYmxlIGE6cG9wb3ZlcjpoaWRlTmF2aWdhYmxlTGVnYWN5IixmdW5jdGlvbihhKXtjLnBvcCgpfSk7cmV0dXJue2ZvcndhcmQ6ZnVuY3Rpb24oYyl7dmFyIGY9Yy5uYW1lKyJfIitiLm5vdygpO2FbIiMiK2ZdPWM7ZChmKX0sYmFjazpmdW5jdGlvbigpezA8ay5sZW5ndGgmJmsucG9wKCk7bT0hMDt0Lmhpc3RvcnkuYmFjaygpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIikucmVnaXN0ZXIoImEtcG9wb3Zlci1wb3NpdGlvbiIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChjLGUpe3ZhciBkPWIudmlld3BvcnQoKSxnOzE9PT1iLnZpZXdwb3J0KCkuem9vbT9nPXt0b3A6MCxsZWZ0OjB9OihhfHwoYT1mKCdceDNjc3BhbiBpZFx4M2QiYS1wb3BvdmVyLW9mZnNldC10cmFja2VyIlx4M2VceDNjL3NwYW5ceDNlJyksCmYoImJvZHkiKS5wcmVwZW5kKGEpKSxnPWEub2Zmc2V0KCkpO3ZhciBrPWUub2Zmc2V0KCksbD1jLm9mZnNldCgpO2lmKGgpe3ZhciByPXQucGFnZVlPZmZzZXQtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtrLnRvcC09cjtsLnRvcC09cn1rLnRvcC09Zy50b3A7ay5sZWZ0LT1nLmxlZnQ7bC50b3AtPWcudG9wO2wubGVmdC09Zy5sZWZ0O3I9ZS5vdXRlcldpZHRoKCk7ZT1lLm91dGVySGVpZ2h0KCk7dmFyIHc9Yy5vdXRlcldpZHRoKCEwKSx4PWMub3V0ZXJIZWlnaHQoITApO2M9Yy5maW5kKCIuYS1wb3BvdmVyLWhlYWRlciIpO2M9Yy5sZW5ndGg/Yy5vdXRlckhlaWdodCghMCk6MDtyZXR1cm57d2luZG93V2lkdGg6ZC53aWR0aCx3aW5kb3dIZWlnaHQ6ZC5oZWlnaHQsd2luZG93VG9wOmQuc2Nyb2xsVG9wLHdpbmRvd0xlZnQ6ZC5zY3JvbGxMZWZ0LHdpbmRvd1JpZ2h0OmQuc2Nyb2xsTGVmdCtkLndpZHRoLHdpbmRvd0JvdHRvbTpkLnNjcm9sbFRvcCtkLmhlaWdodCwKem9vbVRvcDpnLnRvcCx6b29tTGVmdDpnLmxlZnQsdHJpZ2dlcldpZHRoOnIrMSx0cmlnZ2VySGVpZ2h0OmUsdHJpZ2dlclRvcDprLnRvcC1tLHRyaWdnZXJMZWZ0OmsubGVmdC1tLHRyaWdnZXJSaWdodDprLmxlZnQrcittLHRyaWdnZXJCb3R0b206ay50b3ArZSttLHRyaWdnZXJWZXJ0aWNhbENlbnRlcjprLnRvcCtlLzIsdHJpZ2dlckhvcml6b250YWxDZW50ZXI6ay5sZWZ0K3IvMixwb3BvdmVyV2lkdGg6dyxwb3BvdmVySGVpZ2h0OngscG9wb3ZlclRvcDpsLnRvcCxwb3BvdmVyTGVmdDpsLmxlZnQscG9wb3ZlclJpZ2h0OmwubGVmdCt3LHBvcG92ZXJCb3R0b206bC50b3AreCxwb3BvdmVyVmVydGljYWxDZW50ZXI6bC50b3AreC8yLHBvcG92ZXJIb3Jpem9udGFsQ2VudGVyOmwubGVmdCt3LzIsaGVhZGVySGVpZ2h0OmN9fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGEucmVtb3ZlQ2xhc3MoImEtYXJyb3ctdG9wIGEtYXJyb3ctYm90dG9tIGEtYXJyb3ctbGVmdCBhLWFycm93LXJpZ2h0Iil9CmZ1bmN0aW9uIGMoYSl7dmFyIGI9e2RlbHRhVG9wOjB9LGM7Yi50b3A9YS50cmlnZ2VyVmVydGljYWxDZW50ZXItYS5wb3BvdmVySGVpZ2h0LzI7Yi50b3A8YS53aW5kb3dUb3ArMjA/KGM9TWF0aC5taW4oYS53aW5kb3dUb3ArMjAsYS50cmlnZ2VyVG9wLTIwKSxiLmRlbHRhVG9wPWIudG9wLWMsYi50b3A9Yyk6Yi50b3ArYS5wb3BvdmVySGVpZ2h0PmEud2luZG93Qm90dG9tLTIwJiYoYz1NYXRoLm1pbigyMCxhLndpbmRvd0JvdHRvbS1hLnRyaWdnZXJCb3R0b20rMjApLGIuZGVsdGFUb3A9Yi50b3ArYS5wb3BvdmVySGVpZ2h0LShhLndpbmRvd0JvdHRvbS1jKSxiLnRvcD1hLndpbmRvd0JvdHRvbS1jLWEucG9wb3ZlckhlaWdodCk7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhKXt2YXIgYj17ZGVsdGFMZWZ0OjB9LGM7Yi5sZWZ0PWEudHJpZ2dlckhvcml6b250YWxDZW50ZXItYS5wb3BvdmVyV2lkdGgvMjsyMD5iLmxlZnQ/KGM9TWF0aC5taW4oMjAsYS50cmlnZ2VyTGVmdC0yMCksYi5kZWx0YUxlZnQ9CmIubGVmdC1jLGIubGVmdD1jKTpiLmxlZnQrYS5wb3BvdmVyV2lkdGg+YS53aW5kb3dSaWdodC0yMCYmKGM9TWF0aC5taW4oMjAsYS53aW5kb3dSaWdodC1hLnRyaWdnZXJSaWdodCsyMCksYi5kZWx0YUxlZnQ9Yi5sZWZ0K2EucG9wb3ZlcldpZHRoLShhLndpbmRvd1JpZ2h0LWMpLGIubGVmdD1hLndpbmRvd1JpZ2h0LWMtYS5wb3BvdmVyV2lkdGgpO3JldHVybiBifXZhciBmPWIuJDtmKHQpO3ZhciBhPW51bGwsbT0xLGg9Yi5jYXBhYmlsaXRpZXMubW9iaWxlJiZiLmNhcGFiaWxpdGllcy5pc0lFMTBQbHVzO2wud2hlbigicHJ2OnNraW4tdmFycy1kZXNrdG9wIikuZXhlY3V0ZShmdW5jdGlvbihhKXttPWEucG9wb3Zlci5QT1BPVkVSX1NQQUNJTkc/YS5wb3BvdmVyLlBPUE9WRVJfU1BBQ0lORzptfSk7cmV0dXJue3dpbmRvd0NlbnRlcjpmdW5jdGlvbihhKXthPWQoYS4kcG9wb3ZlcixhLiR0cmlnZ2VyKTt2YXIgYj17fTtiLnRvcD0oYS53aW5kb3dIZWlnaHQtYS5wb3BvdmVySGVpZ2h0KS8KMjtiLmxlZnQ9KGEud2luZG93V2lkdGgtYS5wb3BvdmVyV2lkdGgpLzI7MD5iLnRvcCYmKGIudG9wPTApO3JldHVybiBifSx3aW5kb3dUb3A6ZnVuY3Rpb24oYSl7YT1kKGEuJHBvcG92ZXIsYS4kdHJpZ2dlcik7dmFyIGI9e3RvcDowfTtiLmxlZnQ9YS53aW5kb3dXaWR0aC8yLWEucG9wb3ZlcldpZHRoLzI7cmV0dXJuIGJ9LHdpbmRvd0Z1bGxXaWR0aDpmdW5jdGlvbihhKXtyZXR1cm57dG9wOjAsbGVmdDowfX0sdHJpZ2dlclJpZ2h0OmZ1bmN0aW9uKGEsYil7dmFyIGY9YS4kcG9wb3ZlcixoPWEuJHRyaWdnZXI7Ynx8KGI9ZChmLGgpKTtoPWMoYik7aC5sZWZ0PWIudHJpZ2dlclJpZ2h0O2EuYXR0cnMoInBvcG92ZXJBcnJvdyIpJiYoZyhmKS5hZGRDbGFzcygiYS1hcnJvdy1yaWdodCIpLGYuZmluZCgiLmEtYXJyb3ctYm9yZGVyIikuY3NzKCJ0b3AiLGIucG9wb3ZlckhlaWdodC8yK2guZGVsdGFUb3ApKTtyZXR1cm4gaH0sdHJpZ2dlckxlZnQ6ZnVuY3Rpb24oYSxiKXt2YXIgZj1hLiRwb3BvdmVyLApoPWEuJHRyaWdnZXI7Ynx8KGI9ZChmLGgpKTtoPWMoYik7aC5sZWZ0PWIudHJpZ2dlckxlZnQtYi5wb3BvdmVyV2lkdGg7aC5sZWZ0PTA8aC5sZWZ0P2gubGVmdDowO2EuYXR0cnMoInBvcG92ZXJBcnJvdyIpJiYoZyhmKS5hZGRDbGFzcygiYS1hcnJvdy1sZWZ0IiksZi5maW5kKCIuYS1hcnJvdy1ib3JkZXIiKS5jc3MoInRvcCIsYi5wb3BvdmVySGVpZ2h0LzIraC5kZWx0YVRvcCkpO3JldHVybiBofSx0cmlnZ2VyVG9wOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Ynx8KGI9ZChjLGYpKTtmPWsoYik7Zi50b3A9Yi50cmlnZ2VyVG9wLWIucG9wb3ZlckhlaWdodDthLmF0dHJzKCJwb3BvdmVyQXJyb3ciKSYmKGcoYykuYWRkQ2xhc3MoImEtYXJyb3ctdG9wIiksYy5maW5kKCIuYS1hcnJvdy1ib3JkZXIiKS5jc3MoImxlZnQiLGIucG9wb3ZlcldpZHRoLzIrZi5kZWx0YUxlZnQpKTtyZXR1cm4gZn0sdHJpZ2dlckJvdHRvbTpmdW5jdGlvbihhLGIpe3ZhciBjPQphLiRwb3BvdmVyLGY9YS4kdHJpZ2dlcjtifHwoYj1kKGMsZikpO2Y9ayhiKTtmLnRvcD1iLnRyaWdnZXJCb3R0b207YS5hdHRycygicG9wb3ZlckFycm93IikmJihnKGMpLmFkZENsYXNzKCJhLWFycm93LWJvdHRvbSIpLGMuZmluZCgiLmEtYXJyb3ctYm9yZGVyIikuY3NzKCJsZWZ0IixiLnBvcG92ZXJXaWR0aC8yK2YuZGVsdGFMZWZ0KSk7cmV0dXJuIGZ9LHRyaWdnZXJIb3Jpem9udGFsOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Ynx8KGI9ZChjLGYpKTtyZXR1cm4gYi50cmlnZ2VyTGVmdC1iLndpbmRvd0xlZnQ+Yi53aW5kb3dSaWdodC1iLnRyaWdnZXJSaWdodD90aGlzLnRyaWdnZXJMZWZ0KGEsYik6dGhpcy50cmlnZ2VyUmlnaHQoYSxiKX0sdHJpZ2dlclZlcnRpY2FsOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Yj1iP2I6ZChjLGYpO3JldHVybiBiLnRyaWdnZXJUb3AtYi53aW5kb3dUb3A+Yi5wb3BvdmVySGVpZ2h0KwoyMD90aGlzLnRyaWdnZXJUb3AoYSxiKTp0aGlzLnRyaWdnZXJCb3R0b20oYSxiKX0sdHJpZ2dlclZlcnRpY2FsQWxpZ25MZWZ0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kcG9wb3ZlcixmPWEuJHRyaWdnZXI7Ynx8KGI9ZChjLGYpKTt2YXIgZj17fSxoPTAsayxtPWIud2luZG93Qm90dG9tLWIudHJpZ2dlckJvdHRvbTtmLmxlZnQ9Yi50cmlnZ2VyTGVmdDtmLnRvcD1tPmIucG9wb3ZlckhlaWdodD9iLnRyaWdnZXJCb3R0b20rMzpiLnRyaWdnZXJUb3AtYi5wb3BvdmVySGVpZ2h0LTM7MjA+Zi5sZWZ0PyhrPU1hdGgubWluKDIwLGIudHJpZ2dlckxlZnQtMjApLGg9Zi5sZWZ0LWssZi5sZWZ0PWspOmYubGVmdCtiLnBvcG92ZXJXaWR0aD5iLndpbmRvd1JpZ2h0LTIwJiYoaz1NYXRoLm1pbigyMCxiLndpbmRvd1JpZ2h0LWIudHJpZ2dlclJpZ2h0KzIwKSxoPWYubGVmdCtiLnBvcG92ZXJXaWR0aC0oYi53aW5kb3dSaWdodC1rKSxmLmxlZnQ9Yi53aW5kb3dSaWdodC1rLWIucG9wb3ZlcldpZHRoKTsKYS5hdHRycygicG9wb3ZlckFycm93IikmJihnKGMpLmFkZENsYXNzKG0+Yi5wb3BvdmVySGVpZ2h0PyJhLWFycm93LWJvdHRvbSI6ImEtYXJyb3ctdG9wIiksYy5maW5kKCIuYS1hcnJvdy1ib3JkZXIiKS5jc3MoImxlZnQiLGIudHJpZ2dlcldpZHRoLzIraCkpO3JldHVybiBmfSxjdXN0b21Qb3NpdGlvbjpmdW5jdGlvbihhLGIpe3JldHVybiBiLmNhbGwodGhpcyx7cG9wb3ZlcjphLCRwb3BvdmVyOmEuJHBvcG92ZXIsJHRyaWdnZXI6YS4kdHJpZ2dlcixtZWFzdXJlOmR9KX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItdXRpbCIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChiLGMpe2Zvcih2YXIgYT1iLmNoaWxkcmVuLmxlbmd0aDthLS07KXt2YXIgZz1kKGIuY2hpbGRyZW5bYV0sYyk7aWYoZylyZXR1cm4gZ31pZihjKGIpKXJldHVybiBifXZhciBnPWIuJCxjPS9eLT9cZCsoPzpcLlxkKyk/JC87cmV0dXJue3RyaWdnZXI6ZnVuY3Rpb24oYyxmKXtiLnRyaWdnZXIoImE6cG9wb3ZlcjoiKwpjLHtwb3BvdmVyOmZ9KTtmLm5hbWUmJmIudHJpZ2dlcigiYTpwb3BvdmVyOiIrYysiOiIrZi5uYW1lLHtwb3BvdmVyOmZ9KX0sZXh0cmFjdERlY2xhcmF0aXZlUGFyYW1zOmZ1bmN0aW9uKGMsZil7Yz1nKGMpO2M9Yy5oYXNDbGFzcygiYS1kZWNsYXJhdGl2ZSIpP2M6Yy5maW5kKCIuYS1kZWNsYXJhdGl2ZSIpLmVxKDApO2Y9ImEtIitmO3ZhciBhPWMuZGF0YSgiYWN0aW9uIik7cmV0dXJuIGEmJmIuY29udGFpbnMoYSxmKT97YXR0cmlidXRlczpjLmRhdGEoZil8fG51bGwsJHRyaWdnZXI6Y306bnVsbH0sZXZlbnRPY2N1cnNXaXRoaW46ZnVuY3Rpb24oYixjKXtiPWcoYi50YXJnZXQpO3JldHVybiAwPGIuY2xvc2VzdChjLiR0cmlnZ2VyKS5sZW5ndGh8fDA8Yi5jbG9zZXN0KGMuJHBvcG92ZXIpLmxlbmd0aH0sc2VhcmNoOmQsZ2V0Q1NTSGFzaDpmdW5jdGlvbihkKXt2YXIgZj17fTtiLmVhY2goImhlaWdodCB3aWR0aCBtYXgtaGVpZ2h0IG1heC13aWR0aCBtaW4taGVpZ2h0IG1pbi13aWR0aCIuc3BsaXQoIiAiKSwKZnVuY3Rpb24oYSl7aWYoZFthXSl7dmFyIGc9ZFthXTtpZihiLmlzRmluaXRlTnVtYmVyKGcpfHxjLnRlc3QoZykpZys9InB4IjtmW2FdPWd9fSk7Zi5oZWlnaHQmJiFmWyJtYXgtaGVpZ2h0Il0mJihmWyJtYXgtaGVpZ2h0Il09Im5vbmUiKTtmLndpZHRoJiYhZlsibWF4LXdpZHRoIl0mJihmWyJtYXgtd2lkdGgiXT0ibm9uZSIpO3JldHVybiBmfSxjbGVhckNvbnRlbnQ6ZnVuY3Rpb24oYil7KGI9Yi5nZXRDb250ZW50KCkpJiZiLmVtcHR5KCl9LHNob3dTcGlubmVyOmZ1bmN0aW9uKGIpe2IudXBkYXRlQ29udGVudCgnXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWxvYWRpbmctd3JhcHBlciBhLXRleHQtY2VudGVyIlx4M2VceDNjZGl2IGNsYXNzXHgzZCJhLWJveCBhLWNvbG9yLWJhc2UtYmFja2dyb3VuZCBhLXBvcG92ZXItbG9hZGluZyJceDNlXHgzYy9kaXZceDNlXHgzYy9kaXZceDNlJyk7Yi51cGRhdGVQb3NpdGlvbigpO3JldHVybiBifSxnZXRCb29sOmZ1bmN0aW9uKGIsCmMpe3JldHVybiB2b2lkIDAhPT1iPyEwPT09Ynx8InRydWUiPT09YjohMD09PWN9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItdXRpbCIsImEtcG9wb3Zlci1hbmltYXRlIikucmVnaXN0ZXIoImEtbW9kYWwtdmlldy1iYXNlIixmdW5jdGlvbihiLGQsZyl7dmFyIGM9Yi4kLGs9YygiaHRtbCIpLmhhc0NsYXNzKCJhLWx0LWllOSIpO3JldHVybntzZXRBcmlhQnVzeTpmdW5jdGlvbihiKXt0aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItd3JhcHBlciIpLmF0dHIoImFyaWEtYnVzeSIsYil9LHVwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oYil7InN0cmluZyI9PT10eXBlb2YgYj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItaW5uZXIiKS5odG1sKGIpOmImJnRoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmh0bWwoIiIpLmFwcGVuZChiKX0sdXBkYXRlRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJHBvcG92ZXIsYT1kLmdldENTU0hhc2godGhpcy5hdHRycygpKTsKIXRoaXMuZHJhZ2dhYmxlfHxhLndpZHRoJiYiYXV0byIhPT1hLndpZHRofHwoYS53aWR0aD1iLndpZHRoKCkrInB4Iik7Yi5jc3MoYSk7YS5oZWlnaHQ/Yi5hZGRDbGFzcygiYS1wb3BvdmVyLW1vZGFsLWZpeGVkLWhlaWdodCIpOmIucmVtb3ZlQ2xhc3MoImEtcG9wb3Zlci1tb2RhbC1maXhlZC1oZWlnaHQiKTt0aGlzLmlzQWN0aXZlKCkmJnRoaXMudXBkYXRlUG9zaXRpb24oKTtyZXR1cm4gdGhpc30sZ2V0Q29udGVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRwb3BvdmVyP3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpOm51bGx9LHNob3dNZXRob2Q6ZnVuY3Rpb24oYyl7dmFyIGE9dGhpcyxtPWEuJHBvcG92ZXI7bS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSkucmVtb3ZlQ2xhc3MoImEtcG9wb3Zlci1oaWRkZW4iKTtrfHwiYWpheCI9PT1hLmF0dHJzKCJjdXJyZW50RGF0YVN0cmF0ZWd5Iik/Yy5jYWxsKGEpOihtLmNzcyh7b3BhY2l0eTowfSksZy5hbmltYXRlKGEsCntvcGFjaXR5OjF9LDUwMCwibGluZWFyIixmdW5jdGlvbigpe2MuY2FsbChhKX0pKTtiLmFuaW1hdGlvbkZyYW1lRGVsYXkoZnVuY3Rpb24oKXthLmZvY3VzKCl9KTthLmF0dHJzKCJsZWdhY3lOYXZpZ2FibGUiKSYmZC50cmlnZ2VyKCJzaG93TmF2aWdhYmxlTGVnYWN5IixhKX0saGlkZU1ldGhvZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzO2s/KGEuJHBvcG92ZXIuaGlkZSgpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLmZpbmQoIi5hLWxndGJveC12ZXJ0aWNhbC1zY3JvbGwiKS5yZW1vdmVDbGFzcygiYS1sZ3Rib3gtdmVydGljYWwtc2Nyb2xsIiksYi5jYWxsKGEpKTpnLmZhZGVPdXQoYSwyNTAsImxpbmVhciIsZnVuY3Rpb24oKXtiLmNhbGwoYSl9KTthLmF0dHJzKCJsZWdhY3lOYXZpZ2FibGUiKSYmZC50cmlnZ2VyKCJoaWRlTmF2aWdhYmxlTGVnYWN5IixhKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtbW9kYWwtdmlldy1iYXNlIiwiYS1tb2RhbC1wb3NpdGlvbnMiLAoiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHkiKS5yZWdpc3RlcigiYS1tb2RhbC12aWV3IixmdW5jdGlvbihiLGQsZyxjKXt2YXIgaz1iLiQsaz1rKCJodG1sIikuaGFzQ2xhc3MoImEtbHQtaWU5Iik7cmV0dXJuIGIuZXh0ZW5kKGQsYi5jYXBhYmlsaXRpZXMudG91Y2h8fGIuY2FwYWJpbGl0aWVzLm1vYmlsZXx8Yi5jYXBhYmlsaXRpZXMudGFibGV0fHxrP2cuaW5uZXJTY3JvbGw6Zy5tb2RhbFNjcm9sbCx7c2tpbjpmdW5jdGlvbihiKXt2YXIgYT1iLmF0dHJzKCJpZCIpLGQ9Yi5hdHRycygiaGVhZGVyIil8fCIiLGg9Yi5hdHRycygiaGlkZUhlYWRlciIpfHwhMSxnPWIuYXR0cnMoImZvb3RlciIpLGU9Yi5hdHRycygibW9kZWxlc3MiKXx8ITEsaz1iLmF0dHJzKCJjbG9zZUJ1dHRvbiIpLGw9Yi5hdHRycygiY2xvc2VCdXR0b25MYWJlbCIpP2IuYXR0cnMoImNsb3NlQnV0dG9uTGFiZWwiKToiIixxPWIuYXR0cnMoImhpZGVIZWFkZXJDbG9zZUJ1dHRvbkxheW91dCIpfHwiIix1PWIuYXR0cnMoInBvcG92ZXJMYWJlbCIpPwpiLmF0dHJzKCJwb3BvdmVyTGFiZWwiKToiIixyPWIuYXR0cnMoInBhZGRpbmciKTtiPWIuYXR0cnMoImFyaWFEZXNjcmlwdGlvbiIpO3U9e2lkOmEsaGVhZGVyX3N0cjpkLGxhYmVsX3N0cjp1LGFyaWFfZGVzY3JpcHRpb246Yn07az1bJ1x4M2NidXR0b24gZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1jbG9zZSIgY2xhc3NceDNkIicsaz8iIjoiIGEtYnV0dG9uLWNsb3NlLWExMXkiLCIgYS1idXR0b24tY2xvc2UgYS1kZWNsYXJhdGl2ZSIsayYmaD8idG9wIj09PXE/IiBhLW1vZGFsLWNsb3NlLW5vaGVhZC10b3AiOiIgYS1idXR0b24tdG9wLXJpZ2h0IjoiIiwnIiBhcmlhLWxhYmVsXHgzZCInLGwsJyJceDNlXHgzY2kgY2xhc3NceDNkImEtaWNvbiBhLWljb24tY2xvc2UiXHgzZVx4M2MvaVx4M2VceDNjL2J1dHRvblx4M2UnXS5qb2luKCIiKTtkPWg/IiI6WydceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItaGVhZGVyIlx4M2UnLGssJ1x4M2NoNCBjbGFzc1x4M2QiYS1wb3BvdmVyLWhlYWRlci1jb250ZW50JysKKGU/IiBhLXBvcG92ZXItZHJhZ2dhYmxlLWhhbmRsZSI6IiIpKyciIGlkXHgzZCJhLXBvcG92ZXItaGVhZGVyLScsYSwnIlx4M2UnLGQsIlx4M2MvaDRceDNlXHgzYy9kaXZceDNlIl0uam9pbigiIik7Zz1nP1snXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWZvb3RlciJceDNlJyxnLCJceDNjL2Rpdlx4M2UiXS5qb2luKCIiKToiIjtyPSJub25lIj09PXI/IiBhLXBhZGRpbmctbm9uZSI6IiI7cmV0dXJuW2U/IiI6J1x4M2NkaXYgY2xhc3NceDNkImEtbW9kYWwtc2Nyb2xsZXIgYS1kZWNsYXJhdGl2ZSIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1mbG9hdGluZy1jbG9zZSJceDNlJywnXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyIGEtcG9wb3Zlci1tb2RhbCBhLWRlY2xhcmF0aXZlJysoZT8iIGEtbW9kYWwtbW9kZWxlc3MiOiIgIikrJyIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1hMTF5Ilx4M2UnLGMuZ2V0U3RhcnRBbmNob3JIdG1sKHUpLCdceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItd3JhcHBlciJceDNlJywKZCxoP2s6IiIsJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3Zlci1pbm5lcicsciwnIiBpZFx4M2QiYS1wb3BvdmVyLWNvbnRlbnQtJyxhLCciXHgzZVx4M2MvZGl2XHgzZScsZywiXHgzYy9kaXZceDNlIixjLmdldEVuZEFuY2hvckh0bWwodSksIlx4M2MvZGl2XHgzZSIsZT8iIjoiXHgzYy9kaXZceDNlIl0uam9pbigiIil9fSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWxpZ2h0Ym94IiwiYS1wb3BvdmVyLW9wdGlvbmFsLWhlbHBlcnMiKS5yZWdpc3RlcigiYS1tb2RhbC1wb3NpdGlvbnMiLGZ1bmN0aW9uKGIsZCxnKXtmdW5jdGlvbiBjKGEpe3ZhciBiPWEuJHBvcG92ZXIuY2xvc2VzdCgiLmEtbW9kYWwtc2Nyb2xsZXIiKTtiLnNjcm9sbFRvcCgwKS5jc3MoInZpc2liaWxpdHkiLCJ2aXNpYmxlIik7Yi5iaW5kKCJzY3JvbGwiLGZ1bmN0aW9uKCl7YS51cGRhdGVDaGlsZHJlblBvc2l0aW9uKCl9KX1mdW5jdGlvbiBrKCl7dmFyIGE9Yi52aWV3cG9ydCgpOzI8CmEud2lkdGgvYS5oZWlnaHQmJmIuZGVsYXkoZnVuY3Rpb24oKXtkb2N1bWVudC5hY3RpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KCk7dC5zY3JvbGxUbyh0LnBhZ2VYT2Zmc2V0LDApfSwwKX1mdW5jdGlvbiBmKGEsYixjKXtpZigwPmEpcmV0dXJuIGMoeyJwYWRkaW5nLXJpZ2h0IjpiKyJweCIsImJveC1zaXppbmciOiJjb250ZW50LWJveCJ9KSwhMDtjKHsicGFkZGluZy1yaWdodCI6IiIsImJveC1zaXppbmciOiIifSk7cmV0dXJuITF9ZnVuY3Rpb24gYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5jc3MoYil9fXZhciBtPWIuJCxoPWIuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXMmJmIuY2FwYWJpbGl0aWVzLm1vYmlsZSxuPTA7bC53aGVuKCJwcnY6c2tpbi12YXJzIikuZXhlY3V0ZShmdW5jdGlvbihhKXtuPWEucG9wb3Zlci5vcHRpb25hbEJ1dHRvbkhlaWdodH0pO2wuZGVjbGFyZSgicHJ2OmEtbW9kZWwtYXBwbHlIb3Jpem9uYWxTY3JvbGxTdHlsZXMiLGYpO3JldHVybntpbm5lclNjcm9sbDp7cG9zaXRpb25TdHJhdGVneTpmdW5jdGlvbihjKXt2YXIgbD0KYy5wb3BvdmVyLHY9Yy4kcG9wb3ZlcixxPWMuJHRyaWdnZXIsdT12LmZpbmQoIi5hLXBvcG92ZXItaW5uZXIiKS5jc3MoImhlaWdodCIsImF1dG8iKSxyPXYuY2xvc2VzdCgiLmEtbW9kYWwtc2Nyb2xsZXIiKSx3PXt9LHg9Yi52aWV3cG9ydCghMCksej0uMSp4LmhlaWdodCx5PS4wNSp4LndpZHRoLHg9LjgqeC5oZWlnaHQsQT1sLmF0dHJzKCJoZWlnaHQiKSxsPWwuYXR0cnMoIm1pbi1oZWlnaHQiKTt2LmNzcyh7aGVpZ2h0OkE/QToiIiwibWluLWhlaWdodCI6bD9sOiIifSk7cT1jLm1lYXN1cmUodixxKTt3LmxlZnQ9KHEud2luZG93V2lkdGgtcS5wb3BvdmVyV2lkdGgpLzI7Zih3LmxlZnQseSxhKHYpKSYmKHcubGVmdD15KTtnLmV2YWx1YXRlQWN0dWFsSGVpZ2h0KGMscS5wb3BvdmVySGVpZ2h0LG4pPng/KGw9di5maW5kKCIuYS1wb3BvdmVyLWhlYWRlciwgLmEtbW9kYWwtY2xvc2Utbm9oZWFkLXRvcCIpLm91dGVySGVpZ2h0KCEwKXx8MCxBPXYuZmluZCgiLmEtcG9wb3Zlci1mb290ZXIiKS5vdXRlckhlaWdodCghMCl8fAowLGM9Zy5nZXRPZmZzZXRUb3BEZWx0YShjLHosbikseC09Yyx6Kz1jLHUuY3NzKHtoZWlnaHQ6eC1sLUErInB4Iiwib3ZlcmZsb3cteSI6ImF1dG8ifSksdi5jc3Moe2hlaWdodDp4LCJtaW4taGVpZ2h0IjowfSksdy50b3A9eik6KHcudG9wPShxLndpbmRvd0hlaWdodC1xLnBvcG92ZXJIZWlnaHQpLzIsdS5jc3MoImhlaWdodCIsImF1dG8iKSk7dy5sZWZ0Kz1xLnpvb21MZWZ0O3cudG9wKz1xLnpvb21Ub3A7aCYmKHIuY3NzKCJ0b3AiLG0odCkuc2Nyb2xsVG9wKCkpLHYucmVtb3ZlQ2xhc3MoImEtcG9wb3Zlci1wYW4teSIpLmFkZENsYXNzKCJhLXBvcG92ZXItcGFuLXgiKSx2PW0oZG9jdW1lbnQpLmhlaWdodCgpLHU9bShkb2N1bWVudCkud2lkdGgoKSxtKCIjIitkLkxJR0hUQk9YX0lEKS5jc3Moe2hlaWdodDp2LHdpZHRoOnU+cS5wb3BvdmVyV2lkdGg/dTpxLnBvcG92ZXJXaWR0aCt5fSkpO2IuY2FwYWJpbGl0aWVzLmlzTWV0cm9JRUd1ZXNzJiZiLmNhcGFiaWxpdGllcy5pc0lFVG91Y2hDYXBhYmxlJiYKaygpO3JldHVybiB3fSxiZWZvcmVTaG93TWV0aG9kOmIuY29uc3RhbnRzLk5PT1AsYmVmb3JlSGlkZU1ldGhvZDpiLmNvbnN0YW50cy5OT09QfSxtb2RhbFNjcm9sbDp7cG9zaXRpb25TdHJhdGVneTpmdW5jdGlvbihjKXt2YXIgZD1jLiRwb3BvdmVyLGc9Yy4kdHJpZ2dlcixoPWQuY2xvc2VzdCgiLmEtbW9kYWwtc2Nyb2xsZXIiKSxtPWQuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpLmNzcygiaGVpZ2h0IiwiYXV0byIpO2lmKGQuaGFzQ2xhc3MoImEtcG9wb3Zlci1tb2RhbC1maXhlZC1oZWlnaHQiKSl7dmFyIGw9ZC5maW5kKCIuYS1wb3BvdmVyLWZvb3RlciIpO20uY3NzKCJwYWRkaW5nLWJvdHRvbSIsbC5oZWlnaHQoKSsxNSl9dmFyIG09e30sbj1iLnZpZXdwb3J0KCEwKSx0PW4uaGVpZ2h0LGw9LjEqdCxuPS4wNSpuLndpZHRoLHQ9LjgqdCx6PWQuaGVpZ2h0KCkseT1kLndpZHRoKCk7Yz1jLm1lYXN1cmUoZCxnKTttLmxlZnQ9KGMud2luZG93V2lkdGgteSkvMjttLnRvcD0oYy53aW5kb3dIZWlnaHQtCnopLzI7ZihtLmxlZnQsbixhKGQpKSYmKG0ubGVmdD1uKTt6PnQ/aC5sZW5ndGg/KG0udG9wPTAsZC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbWFyZ2luOmMuem9vbVRvcCtsKyJweCAwICIrbCsicHggIisoYy56b29tTGVmdCttLmxlZnQpKyJweCJ9KSxtLmxlZnQ9MCxoLmNzcygicGFkZGluZy1ib3R0b20iLCIxcHgiKSk6ej50JiYobS50b3A9cGFkZGluZyk6aC5sZW5ndGgmJihkLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixtYXJnaW46IjBweCJ9KSxoLmNzcygicGFkZGluZy1ib3R0b20iLCIwcHgiKSk7bS5sZWZ0Kz1jLnpvb21MZWZ0O20udG9wKz1jLnpvb21Ub3A7Yi5jYXBhYmlsaXRpZXMuaXNNZXRyb0lFR3Vlc3MmJmIuY2FwYWJpbGl0aWVzLmlzSUVUb3VjaENhcGFibGUmJmsoKTtyZXR1cm4gbX0sYmVmb3JlU2hvd01ldGhvZDpmdW5jdGlvbigpe2ModGhpcyl9LGJlZm9yZUhpZGVNZXRob2Q6ZnVuY3Rpb24oKXt0aGlzLiRwb3BvdmVyLmNsb3Nlc3QoIi5hLW1vZGFsLXNjcm9sbGVyIikuY3NzKCJ2aXNpYmlsaXR5IiwKImhpZGRlbiIpLnVuYmluZCgic2Nyb2xsIil9fSx1dGlsOntkZXRlcm1pbmVNYXhpbXVtSW5uZXJIZWlnaHQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS4kcG9wb3ZlcjthPS44KmIudmlld3BvcnQoKS5oZWlnaHQ7dmFyIGQ9Yy5maW5kKCIuYS1wb3BvdmVyLWhlYWRlciwgLmEtbW9kYWwtY2xvc2Utbm9oZWFkLXRvcCIpLm91dGVySGVpZ2h0KCEwKXx8MCxjPWMuZmluZCgiLmEtcG9wb3Zlci1mb290ZXIiKS5vdXRlckhlaWdodCghMCl8fDA7cmV0dXJuIGEtZC1jfSxkZXRlcm1pbmVJbm5lclZlcnRpY2FsUGFkZGluZzpmdW5jdGlvbihhKXthPWEuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci1pbm5lciIpO3JldHVybiBhLm91dGVySGVpZ2h0KCktYS5oZWlnaHQoKX19fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IiwiYS1tb2RhbC12aWV3IiwiYS1wb3BvdmVyLXV0aWwiKS5yZWdpc3RlcigiYS1tb2RhbC1mYWN0b3J5IixmdW5jdGlvbihiLGQsCmcsYyl7ZnVuY3Rpb24gayhrLGgpe3ZhciBsPSExLGU9ITE7Yi5jYXBhYmlsaXRpZXMubW9iaWxlfHxiLmNhcGFiaWxpdGllcy50YWJsZXR8fChsPWMuZ2V0Qm9vbChoLm1vZGVsZXNzKSxlPWMuZ2V0Qm9vbChoLmRyYWdnYWJsZSkpO2g9e21vZGVsZXNzOmwsZHJhZ2dhYmxlOmUsdHlwZToibW9kYWwiLGFsb25lOiEwLGltbWVyc2l2ZTohMCxwb3NpdGlvbjoid2luZG93Q2VudGVyIixoZWFkZXI6aC5oZWFkZXIsaGlkZUhlYWRlcjpoLmhpZGVIZWFkZXIsZm9vdGVyOmguZm9vdGVyLHBhZGRpbmc6aC5wYWRkaW5nLHdpZHRoOmgud2lkdGgsaGVpZ2h0OmguaGVpZ2h0LCJtYXgtd2lkdGgiOmhbIm1heC13aWR0aCJdLCJtYXgtaGVpZ2h0IjpoWyJtYXgtaGVpZ2h0Il0sIm1pbi13aWR0aCI6aFsibWluLXdpZHRoIl0sIm1pbi1oZWlnaHQiOmhbIm1pbi1oZWlnaHQiXSxjbG9zZUJ1dHRvbjpjLmdldEJvb2woaC5jbG9zZUJ1dHRvbiwhMCksdGltZW91dDpoLnRpbWVvdXQsbGlnaHRib3hPcHRpb25zOmw/CnZvaWQgMDp7bG9ja1Njcm9sbDohMCxzaG93RHVyYXRpb246Znx8YT8wOm51bGx9LGRhdGE6aC5kYXRhfHx7fSxkYXRhU3RyYXRlZ3k6aC5kYXRhU3RyYXRlZ3ksdXJsOmgudXJsLG1hbnVhbFJlZnJlc2g6ISFoLm1hbnVhbFJlZnJlc2gsYWpheEZhaWxNc2c6aC5hamF4RmFpbE1zZyxjYWNoZTpjLmdldEJvb2woaC5jYWNoZSwhMCksaW5saW5lQ29udGVudDpoLmlubGluZUNvbnRlbnQ/aC5pbmxpbmVDb250ZW50OmguY29udGVudCxuYW1lOmgubmFtZSxjbG9zZUJ1dHRvbkxhYmVsOmguY2xvc2VCdXR0b25MYWJlbD9oLmNsb3NlQnV0dG9uTGFiZWw6IkNsb3NlIixoaWRlSGVhZGVyQ2xvc2VCdXR0b25MYXlvdXQ6aC5oaWRlSGVhZGVyQ2xvc2VCdXR0b25MYXlvdXQscG9wb3ZlckxhYmVsOmgucG9wb3ZlckxhYmVsLGFyaWFEZXNjcmlwdGlvbjpoLmFyaWFEZXNjcmlwdGlvbixsZWdhY3lOYXZpZ2FibGU6Yy5nZXRCb29sKGgubGVnYWN5TmF2aWdhYmxlLCEwKX07cmV0dXJuIGQuY3JlYXRlKGssCnthdHRyaWJ1dGVzOmgsdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KX12YXIgZj0tMTxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoImEtbHQtaWU5IiksYT1iLmNhcGFiaWxpdGllcy5tb2JpbGUmJmIuY2FwYWJpbGl0aWVzLmlzSUUxMFBsdXM7cmV0dXJue3R5cGU6Im1vZGFsIixjcmVhdGU6ayxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ZC5nZXQoYSwibW9kYWwiKTtifHwib2JqZWN0IiE9PXR5cGVvZiBhfHwoYT1jLmV4dHJhY3REZWNsYXJhdGl2ZVBhcmFtcyhhLCJtb2RhbCIpKSYmKGI9ayhhLiR0cmlnZ2VyLGEuYXR0cmlidXRlc3x8e30pKTtyZXR1cm4gYn0scmVtb3ZlOmZ1bmN0aW9uKGEpe3JldHVybiBkLnJlbW92ZShhLCJtb2RhbCIpfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsImEtbW9kYWwtZmFjdG9yeSIsInJlYWR5IikucmVnaXN0ZXIoImEtbW9kYWwtaGFuZGxlcnMiLApmdW5jdGlvbihiLGQsZyl7ZD1iLiQ7Yi5kZWNsYXJhdGl2ZSgiYS1tb2RhbCIsImNsaWNrIixmdW5jdGlvbihiKXtnLmdldChiLiRkZWNsYXJhdGl2ZVBhcmVudCkuc2hvdygpO2IuJGV2ZW50LnByZXZlbnREZWZhdWx0KCl9KTtkKGRvY3VtZW50KS5kZWxlZ2F0ZSgiLmEtbW9kYWwtc2Nyb2xsZXIiLCJjbGljayAiK2IuYWN0aW9uLnN0YXJ0KyIgIitiLmFjdGlvbi5tb3ZlLGZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcyYmYi5wcmV2ZW50RGVmYXVsdCgpfSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1tb2RhbC1mYWN0b3J5IiwiYS1wb3BvdmVyLWJhc2UiLCJhLW1vZGFsLWhhbmRsZXJzIikucmVnaXN0ZXIoImEtbW9kYWwiLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLXV0aWwiLCJhLXBvcG92ZXItYW5pbWF0ZSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItdmlldy1iYXNlIixmdW5jdGlvbihiLGQsZyl7cmV0dXJue3NldEFyaWFCdXN5OmZ1bmN0aW9uKGIpe3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtcG9wb3Zlci13cmFwcGVyIikuYXR0cigiYXJpYS1idXN5IiwKYil9LHVwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oYil7InN0cmluZyI9PT10eXBlb2YgYj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItY29udGVudCIpLmh0bWwoYik6YiYmdGhpcy4kcG9wb3Zlci5maW5kKCIuYS1wb3BvdmVyLWNvbnRlbnQiKS5odG1sKCIiKS5hcHBlbmQoYil9LHVwZGF0ZURpbWVuc2lvbnM6ZnVuY3Rpb24oKXt0aGlzLiRwb3BvdmVyLmNzcyhkLmdldENTU0hhc2godGhpcy5hdHRycygpKSk7dGhpcy5pc0FjdGl2ZSgpJiZ0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7cmV0dXJuIHRoaXN9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9wb3Zlcj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXBvcG92ZXItY29udGVudCIpOm51bGx9LGhpZGVNZXRob2Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcztnLmZhZGVPdXQoZCwyNTAsImxpbmVhciIsZnVuY3Rpb24oKXtkLiRwb3BvdmVyLmNzcyh7dG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pO2IuY2FsbChkKX0pfX19KTsKbC53aGVuKCJhLXV0aWwiKS5yZWdpc3RlcigiYS1wb3BvdmVyLW9wdGlvbmFsLWhlbHBlcnMiLGZ1bmN0aW9uKGIpe3JldHVybntnZXRPZmZzZXRUb3BEZWx0YTpmdW5jdGlvbihkLGcsYyl7Yz1wYXJzZUZsb2F0KGMpO3ZhciBrPWIuaXNGaW5pdGVOdW1iZXIoYykmJjA8YztkPWQuJHBvcG92ZXIuZmluZCgiLmEtYnV0dG9uLWNsb3NlIikubGVuZ3RoJiYhZC4kcG9wb3Zlci5maW5kKCIuYS1idXR0b24tY2xvc2UtYTExeSIpLmxlbmd0aDtyZXR1cm4gayYmZCYmMD5nLWM/Yy1nOjB9LGV2YWx1YXRlQWN0dWFsSGVpZ2h0OmZ1bmN0aW9uKGIsZyxjKXtyZXR1cm4gYi4kcG9wb3Zlci5maW5kKCIuYS1idXR0b24tY2xvc2UiKS5sZW5ndGgmJiFiLiRwb3BvdmVyLmZpbmQoIi5hLWJ1dHRvbi1jbG9zZS1hMTF5IikubGVuZ3RoP2crYzpnfX19KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLXZpZXctYmFzZSIsImEtcG9wb3Zlci11dGlsIiwiYS1wb3BvdmVyLWFjY2Vzc2liaWxpdHkiKS5yZWdpc3RlcigiYS1wb3BvdmVyLXZpZXciLApmdW5jdGlvbihiLGQsZyxjKXt2YXIgaz0hMDtsLndoZW4oInBydjpza2luLXZhcnMiKS5leGVjdXRlKGZ1bmN0aW9uKGIpe2s9Yi5wb3BvdmVyLmNsb3NlQnV0dG9uRW5hYmxlZH0pO3JldHVybiBiLmV4dGVuZChkLHtza2luOmZ1bmN0aW9uKGIpe3ZhciBhPWIuYXR0cnMoImlkIiksZD1iLmF0dHJzKCJoZWFkZXIiKSxnPWsmJmIuYXR0cnMoImNsb3NlQnV0dG9uIiksbD1iLmF0dHJzKCJjbG9zZUJ1dHRvbkxhYmVsIik/Yi5hdHRycygiY2xvc2VCdXR0b25MYWJlbCIpOiIiLGU9Yi5hdHRycygicG9wb3ZlckxhYmVsIik/Yi5hdHRycygicG9wb3ZlckxhYmVsIik6IiIscD1iLmF0dHJzKCJhcmlhRGVzY3JpcHRpb24iKSx0PWIuYXR0cnMoInBhZGRpbmciKTtiPWIuYXR0cnMoInBvcG92ZXJBcnJvdyIpO2U9e2lkOmEsaGVhZGVyX3N0cjpkLGxhYmVsX3N0cjplLGFyaWFfZGVzY3JpcHRpb246cH07Zz0nXHgzY2J1dHRvbiBkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWNsb3NlIiBjbGFzc1x4M2QiYS1idXR0b24tY2xvc2UgJysKKGc/IiI6ImEtYnV0dG9uLWNsb3NlLWExMXkiKSsnIGEtZGVjbGFyYXRpdmUiIGFyaWEtbGFiZWxceDNkIicrbCsnIlx4M2VceDNjaSBjbGFzc1x4M2QiYS1pY29uIGEtaWNvbi1jbG9zZSJceDNlXHgzYy9pXHgzZVx4M2MvYnV0dG9uXHgzZSc7ZD0obD1kJiYiIiE9PWQpP1snXHgzY2RpdiBjbGFzc1x4M2QiYS1wb3BvdmVyLWhlYWRlciJceDNlJyxnLCdceDNjaDQgY2xhc3NceDNkImEtcG9wb3Zlci1oZWFkZXItY29udGVudCIgaWRceDNkImEtcG9wb3Zlci1oZWFkZXItJyxhLCciXHgzZScsZCwiXHgzYy9oNFx4M2VceDNjL2Rpdlx4M2UiXS5qb2luKCIiKToiIjt0PSJub25lIj09PXQ/IiBhLXBhZGRpbmctbm9uZSI6IiI7Yj1iPydceDNjZGl2IGNsYXNzXHgzZCJhLWFycm93LWJvcmRlciJceDNlXHgzY2RpdiBjbGFzc1x4M2QiYS1hcnJvdyJceDNlXHgzYy9kaXZceDNlXHgzYy9kaXZceDNlJzoiIjtyZXR1cm5bJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3ZlciAnLGw/ImEtcG9wb3Zlci1oYXMtaGVhZGVyIjoKImEtcG9wb3Zlci1uby1oZWFkZXIiLCcgYS1kZWNsYXJhdGl2ZSIgZGF0YS1hY3Rpb25ceDNkImEtcG9wb3Zlci1jb250YWluZXIgYS1wb3BvdmVyLWExMXkiXHgzZScsYy5nZXRTdGFydEFuY2hvckh0bWwoZSksJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3Zlci13cmFwcGVyIlx4M2UnLGQsJ1x4M2NkaXYgY2xhc3NceDNkImEtcG9wb3Zlci1pbm5lcicsdCwnIlx4M2UnLCIiPT09ZD9nOiIiLCdceDNjZGl2IGNsYXNzXHgzZCJhLXBvcG92ZXItY29udGVudCIgaWRceDNkImEtcG9wb3Zlci1jb250ZW50LScsYSwnIlx4M2VceDNjL2Rpdlx4M2VceDNjL2Rpdlx4M2UnLGIsIlx4M2MvZGl2XHgzZSIsYy5nZXRFbmRBbmNob3JIdG1sKGUpLCJceDNjL2Rpdlx4M2UiXS5qb2luKCIiKX19KX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IiwiYS1wb3BvdmVyLXZpZXciLCJhLXBvcG92ZXItdXRpbCIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItZmFjdG9yeSIsCmZ1bmN0aW9uKGIsZCxnLGMpe2Z1bmN0aW9uIGsoYixhKXthPXt0eXBlOiJwb3BvdmVyIixhbG9uZTohMCxoZWFkZXI6YS5oZWFkZXIsd2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHQsIm1heC13aWR0aCI6YVsibWF4LXdpZHRoIl0sIm1heC1oZWlnaHQiOmFbIm1heC1oZWlnaHQiXSwibWluLXdpZHRoIjphWyJtaW4td2lkdGgiXSwibWluLWhlaWdodCI6YVsibWluLWhlaWdodCJdLHBhZGRpbmc6YS5wYWRkaW5nLGNsb3NlQnV0dG9uOmMuZ2V0Qm9vbChhLmNsb3NlQnV0dG9uLCEwKSxwb3NpdGlvbjphLnBvc2l0aW9ufHwidHJpZ2dlclZlcnRpY2FsIixhY3RpdmF0ZTphLmFjdGl2YXRlfHwib25tb3VzZW92ZXIiLHRpbWVvdXQ6YS50aW1lb3V0LGRhdGE6YS5kYXRhfHx7fSxkYXRhU3RyYXRlZ3k6YS5kYXRhU3RyYXRlZ3ksdXJsOmEudXJsLG1hbnVhbFJlZnJlc2g6ISFhLm1hbnVhbFJlZnJlc2gsYWpheEZhaWxNc2c6YS5hamF4RmFpbE1zZyxjYWNoZTpjLmdldEJvb2woYS5jYWNoZSwKITApLGlubGluZUNvbnRlbnQ6YS5pbmxpbmVDb250ZW50P2EuaW5saW5lQ29udGVudDphLmNvbnRlbnQsbmFtZTphLm5hbWUsY2xvc2VCdXR0b25MYWJlbDphLmNsb3NlQnV0dG9uTGFiZWw/YS5jbG9zZUJ1dHRvbkxhYmVsOiJDbG9zZSIscG9wb3ZlckxhYmVsOmEucG9wb3ZlckxhYmVsLGFyaWFEZXNjcmlwdGlvbjphLmFyaWFEZXNjcmlwdGlvbixmb2N1c1doZW5TaG93bjpjLmdldEJvb2woYS5mb2N1c1doZW5TaG93biwhMCkscG9wb3ZlckFycm93OmMuZ2V0Qm9vbChhLnBvcG92ZXJBcnJvdywhMCkscmVzdG9yZUZvY3VzT25IaWRlOmMuZ2V0Qm9vbChhLnJlc3RvcmVGb2N1c09uSGlkZSwhMCl9O3JldHVybiBkLmNyZWF0ZShiLHthdHRyaWJ1dGVzOmEsdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KX1yZXR1cm57dHlwZToicG9wb3ZlciIsY3JlYXRlOmssZ2V0OmZ1bmN0aW9uKGIpe3ZhciBhPWQuZ2V0KGIsInBvcG92ZXIiKTthfHwib2JqZWN0IiE9PXR5cGVvZiBifHwKKGI9Yy5leHRyYWN0RGVjbGFyYXRpdmVQYXJhbXMoYiwicG9wb3ZlciIpKSYmKGE9ayhiLiR0cmlnZ2VyLGIuYXR0cmlidXRlc3x8e30pKTtyZXR1cm4gYX0scmVtb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiBkLnJlbW92ZShiLCJwb3BvdmVyIil9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItZmFjdG9yeSIpLnJlZ2lzdGVyKCJhLXBvcG92ZXItaGFuZGxlcnMiLGZ1bmN0aW9uKGIsZCl7ZnVuY3Rpb24gZyhhKXthJiYhYS5kZXN0cm95VGltZXImJihhLmRlc3Ryb3lUaW1lcj1iLmRlbGF5KGZ1bmN0aW9uKCl7YS5oaWRlKCl9LDI1MCkpfWZ1bmN0aW9uIGMoYSl7YSYmKGNsZWFyVGltZW91dChhLmRlc3Ryb3lUaW1lciksYS5kZXN0cm95VGltZXI9bnVsbCxjbGVhclRpbWVvdXQoYS5wYXJlbnQuZGVzdHJveVRpbWVyKSxhLnBhcmVudC5kZXN0cm95VGltZXI9bnVsbCl9dmFyIGs9Yi4kLGY9IShiLmNhcGFiaWxpdGllcy5tb2JpbGV8fGIuY2FwYWJpbGl0aWVzLnRhYmxldCkmJgpiLmNhcGFiaWxpdGllcy5pb3M7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyIiwiY2xpY2siLGZ1bmN0aW9uKGEpe3ZhciBiPWQuZ2V0KGEuJGRlY2xhcmF0aXZlUGFyZW50KTtiJiYoIm9uY2xpY2siPT09Yi5hdHRycygiYWN0aXZhdGUiKXx8ZikmJihiLnNob3coKSxhLiRldmVudC5wcmV2ZW50RGVmYXVsdCgpKX0pO2IuZGVjbGFyYXRpdmUoImEtcG9wb3ZlciIsImtleWRvd24iLGZ1bmN0aW9uKGEpe3ZhciBjPWIuY29uc3RhbnRzLmtleWNvZGVzLGc9YS4kZXZlbnQud2hpY2g7aWYoZz09PWMuRU5URVJ8fGc9PT1jLlNQQUNFKWEuJGV2ZW50LnByZXZlbnREZWZhdWx0KCksZC5nZXQoYS4kZGVjbGFyYXRpdmVQYXJlbnQpLnNob3coKX0pO2lmKCFmKXt2YXIgYTtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXIiLCJtb3VzZWVudGVyIixmdW5jdGlvbihnKXt2YXIgaD1kLmdldChnLiRkZWNsYXJhdGl2ZVBhcmVudCk7aCYmIm9ubW91c2VvdmVyIj09PWguYXR0cnMoImFjdGl2YXRlIikmJihjKGgpLAphPWIuZGVsYXkoZnVuY3Rpb24oKXsoaD1kLmdldChnLiRkZWNsYXJhdGl2ZVBhcmVudCkpJiZoLnNob3coKX0sMjAwKSl9KTtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXIiLCJtb3VzZW1vdmUiLGZ1bmN0aW9uKGEpezI+Yi5jdXJzb3IoKS5zcGVlZCYmKGE9ZC5nZXQoYS4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWEuYXR0cnMoImFjdGl2YXRlIikmJmEuc2hvdygpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyIiwibW91c2VsZWF2ZSIsZnVuY3Rpb24oYil7KGI9ZC5nZXQoYi4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWIuYXR0cnMoImFjdGl2YXRlIikmJihnKGIpLGEmJmNsZWFyVGltZW91dChhKSl9KTtiLmRlY2xhcmF0aXZlKCJhLXBvcG92ZXItY29udGFpbmVyIiwibW91c2VlbnRlciIsZnVuY3Rpb24oYSl7KGE9ZC5nZXQoYS4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWEuYXR0cnMoImFjdGl2YXRlIikmJgpjKGEpfSk7Yi5kZWNsYXJhdGl2ZSgiYS1wb3BvdmVyLWNvbnRhaW5lciIsIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKGEpe3ZhciBjPWQuZ2V0KGEuJGRlY2xhcmF0aXZlUGFyZW50KSxmPSEwLGU9ayhhLiRldmVudC5yZWxhdGVkVGFyZ2V0KTtjJiYib25tb3VzZW92ZXIiPT09Yy5hdHRycygiYWN0aXZhdGUiKSYmYy5pc0FjdGl2ZSgpJiYoYi5lYWNoKGMuY2hpbGRyZW4sZnVuY3Rpb24oYSl7aWYoZS5jbG9zZXN0KGEuJHBvcG92ZXIpLmxlbmd0aClyZXR1cm4gZj0hMX0pLGYmJihnKGMpLGMucGFyZW50LmltbWVyc2l2ZXx8MCE9PWUuY2xvc2VzdChjLnBhcmVudC4kcG9wb3ZlcikubGVuZ3RofHxnKGMucGFyZW50KSkpfSl9fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtcG9wb3Zlci1mYWN0b3J5IiwiYS1wb3BvdmVyLWJhc2UiLCJhLXBvcG92ZXItaGFuZGxlcnMiKS5yZWdpc3RlcigiYS1wb3BvdmVyIixmdW5jdGlvbihiLGQpe3JldHVybiBkfSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsCiJhLXBvcG92ZXItYmFzZS1mYWN0b3J5IiwiYS1zZWNvbmRhcnktdmlldy12aWV3IiwiYS1wb3BvdmVyLXV0aWwiKS5yZWdpc3RlcigiYS1zZWNvbmRhcnktdmlldy1mYWN0b3J5IixmdW5jdGlvbihiLGQsZyxjKXtmdW5jdGlvbiBrKGMsZil7Zi5kaXNhYmxlQW5pbWF0aW9uPWYuZGlzYWJsZUFuaW1hdGlvbnx8Yi5jYXBhYmlsaXRpZXMuaXNPbGRBbmRyb2lkO3JldHVybiBkLmNyZWF0ZShjLHthdHRyaWJ1dGVzOnt0eXBlOiJzZWNvbmRhcnktdmlldyIsaW1tZXJzaXZlOiEwLGRpc2FibGVBbmltYXRpb246YXx8Zi5kaXNhYmxlQW5pbWF0aW9uLHN5bmNocm9ub3VzOiEhKGF8fGYuc3luY2hyb25vdXMmJiJmYWxzZSIhPT1mLnN5bmNocm9ub3VzKSxhbmltYXRpb25MZW5ndGg6Zi5kaXNhYmxlQW5pbWF0aW9uPzA6MzAwLGFsdGVybmF0ZUJhY2tncm91bmQ6Zi5hbHRlcm5hdGVCYWNrZ3JvdW5kfHwhMSxoaWRlSGVhZGVyOmF8fGYuaGlkZUhlYWRlcnx8ITEsc2Nyb2xsYWJsZTpmLnNjcm9sbGFibGV8fAohMCxoZWFkZXI6Zi5oZWFkZXIsYmFja0J1dHRvblRleHQ6Zi5iYWNrQnV0dG9uVGV4dCxwb3NpdGlvbjoid2luZG93RnVsbFdpZHRoIix0aW1lb3V0OmYudGltZW91dCxkYXRhU3RyYXRlZ3k6Zi5kYXRhU3RyYXRlZ3ksaW5saW5lQ29udGVudDpmLmlubGluZUNvbnRlbnQ/Zi5pbmxpbmVDb250ZW50OmYuY29udGVudCx1cmw6Zi51cmwsbWFudWFsUmVmcmVzaDohIWYubWFudWFsUmVmcmVzaCxuYW1lOmYubmFtZSxjYWNoZToiZmFsc2UiPT09Zi5jYWNoZXx8ITE9PT1mLmNhY2hlPyExOiEwLGRhdGE6Zi5kYXRhfHx7fSxwb3BvdmVyTGFiZWw6Zi5wb3BvdmVyTGFiZWwscGFkZGluZzpmLnBhZGRpbmcsYXJpYURlc2NyaXB0aW9uOmYuYXJpYURlc2NyaXB0aW9uLGhpc3RvcnlBcGk6InRydWUiPT09Zi5oaXN0b3J5QXBpfHwhMD09PWYuaGlzdG9yeUFwaX0sdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KX12YXIgZj1iLiQsYT0hMTtsLndoZW4oIm1hc2gtd2lsbC1sb2FkIikuZXhlY3V0ZShmdW5jdGlvbigpe2E9CiEwfSk7cmV0dXJue3R5cGU6InNlY29uZGFyeS12aWV3IixjcmVhdGU6ayxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ZC5nZXQoYSwic2Vjb25kYXJ5LXZpZXciKTtpZighYiYmIm9iamVjdCI9PT10eXBlb2YgYSl7dmFyIGc9Yy5leHRyYWN0RGVjbGFyYXRpdmVQYXJhbXMoYSwic2Vjb25kYXJ5LXZpZXciKTtnJiYoYj1rKGcuJHRyaWdnZXIsZy5hdHRyaWJ1dGVzfHx7fSkpfWImJiJvYmplY3QiPT09dHlwZW9mIGEmJihhPWYoYSksYT0oYT1hLmhhc0NsYXNzKCJhLWRlY2xhcmF0aXZlIik/YTphLmZpbmQoIi5hLWRlY2xhcmF0aXZlIikuZXEoMCkpP2EuZGF0YSgiYS1zZWNvbmRhcnktdmlldyIpOm51bGwsYi5kYXRhPWEuZGF0YSk7cmV0dXJuIGJ9LHJlbW92ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5yZW1vdmUoYSwic2Vjb25kYXJ5LXZpZXciKX19fSk7InVzZSBzdHJpY3QiO2wud2hlbigiQSIsImEtc2Vjb25kYXJ5LXZpZXctZmFjdG9yeSIsImEtcG9wb3Zlci1iYXNlIiwiYS1zZWNvbmRhcnktdmlldy1oYW5kbGVycyIpLnJlZ2lzdGVyKCJhLXNlY29uZGFyeS12aWV3IiwKZnVuY3Rpb24oYixkKXtyZXR1cm4gZH0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXBvcG92ZXItYW5pbWF0ZSIpLnJlZ2lzdGVyKCJhLXRvb2x0aXAtdmlldy1iYXNlIixmdW5jdGlvbihiLGQpe3JldHVybnt1cGRhdGVDb250ZW50OmZ1bmN0aW9uKGIpe3RoaXMuJHBvcG92ZXIuZmluZCgiLmEtdG9vbHRpcC1pbm5lciIpLmh0bWwoYil9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9wb3Zlcj90aGlzLiRwb3BvdmVyLmZpbmQoIi5hLXRvb2x0aXAtaW5uZXIiKTpudWxsfSxoaWRlTWV0aG9kOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7ZC5mYWRlT3V0KGMsMjUwLCJsaW5lYXIiLGZ1bmN0aW9uKCl7Yi5jYWxsKGMpfSl9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXRvb2x0aXAtdmlldy1iYXNlIikucmVnaXN0ZXIoImEtdG9vbHRpcC12aWV3IixmdW5jdGlvbihiLGQpe3JldHVybiBiLmV4dGVuZChkLHtza2luOmZ1bmN0aW9uKGIpe3JldHVyblsnXHgzY2RpdiByb2xlXHgzZCJ0b29sdGlwIiBjbGFzc1x4M2QiYS1wb3BvdmVyIGEtdG9vbHRpcCBhLWRlY2xhcmF0aXZlIiBkYXRhLWFjdGlvblx4M2QiYS1wb3BvdmVyLWNsb3NlIlx4M2VceDNjZGl2IGNsYXNzXHgzZCJhLXRvb2x0aXAtaW5uZXIiXHgzZVx4M2MvZGl2XHgzZScsCmIuYXR0cnMoInBvcG92ZXJBcnJvdyIpPydceDNjZGl2IGNsYXNzXHgzZCJhLWFycm93LWJvcmRlciJceDNlXHgzY2RpdiBjbGFzc1x4M2QiYS1hcnJvdyJceDNlXHgzYy9kaXZceDNlXHgzYy9kaXZceDNlJzoiIiwiXHgzYy9kaXZceDNlIl0uam9pbigiIil9fSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS1wb3BvdmVyLWJhc2UtZmFjdG9yeSIsImEtdG9vbHRpcC12aWV3IiwiYS1wb3BvdmVyLXV0aWwiKS5yZWdpc3RlcigiYS10b29sdGlwLWZhY3RvcnkiLGZ1bmN0aW9uKGIsZCxnLGMpe2Z1bmN0aW9uIGsoYixhKXthPXt0eXBlOiJ0b29sdGlwIixuYW1lOmEubmFtZSxpbmxpbmVDb250ZW50OmEuaW5saW5lQ29udGVudD9hLmlubGluZUNvbnRlbnQ6YS5jb250ZW50LHBvc2l0aW9uOmEucG9zaXRpb258fCJ0cmlnZ2VyVmVydGljYWwiLGFjdGl2YXRlOmEuYWN0aXZhdGV8fCJvbm1vdXNlb3ZlciIscG9wb3ZlckFycm93OmMuZ2V0Qm9vbChhLnBvcG92ZXJBcnJvdywhMCkscmVzdG9yZUZvY3VzT25IaWRlOiExfTsKYT1kLmNyZWF0ZShiLHthdHRyaWJ1dGVzOmEsdHlwZVNwZWNpZmljRnVuY3Rpb25zOmcsYWN0aW9uQ2hlY2s6ITB9KTtiLmFkZChiLmNoaWxkcmVuKCkpLmZpbHRlcigiYSwgaW5wdXQiKS5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IiwiYS1wb3BvdmVyLSIrYi5kYXRhKCJhLXBvcG92ZXItaWQiKSk7cmV0dXJuIGF9cmV0dXJue3R5cGU6InRvb2x0aXAiLGNyZWF0ZTprLGdldDpmdW5jdGlvbihiKXt2YXIgYT1kLmdldChiLCJ0b29sdGlwIik7YXx8Im9iamVjdCIhPT10eXBlb2YgYnx8KGI9Yy5leHRyYWN0RGVjbGFyYXRpdmVQYXJhbXMoYiwidG9vbHRpcCIpKSYmKGE9ayhiLiR0cmlnZ2VyLGIuYXR0cmlidXRlc3x8e30pKTtyZXR1cm4gYX0scmVtb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiBkLnJlbW92ZShiLCJ0b29sdGlwIil9fX0pOyJ1c2Ugc3RyaWN0IjtsLndoZW4oIkEiLCJhLXRvb2x0aXAtZmFjdG9yeSIpLnJlZ2lzdGVyKCJhLXRvb2x0aXAtaGFuZGxlcnMiLGZ1bmN0aW9uKGIsCmQpe2IuZGVjbGFyYXRpdmUoImEtdG9vbHRpcCIsImNsaWNrIixmdW5jdGlvbihiKXt2YXIgYz1kLmdldChiLiRkZWNsYXJhdGl2ZVBhcmVudCk7YyYmIm9uY2xpY2siPT09Yy5hdHRycygiYWN0aXZhdGUiKSYmKGMuc2hvdygpLGIuJGV2ZW50LnByZXZlbnREZWZhdWx0KCkpfSk7Yi5kZWNsYXJhdGl2ZSgiYS10b29sdGlwIiwibW91c2VlbnRlciIsZnVuY3Rpb24oYil7KGI9ZC5nZXQoYi4kZGVjbGFyYXRpdmVQYXJlbnQpKSYmIm9ubW91c2VvdmVyIj09PWIuYXR0cnMoImFjdGl2YXRlIikmJihiLnNob3coKSxiLmRlc3Ryb3lUaW1lciYmKGNsZWFyVGltZW91dChiLmRlc3Ryb3lUaW1lciksYi5kZXN0cm95VGltZXI9bnVsbCkpfSk7Yi5kZWNsYXJhdGl2ZSgiYS10b29sdGlwIiwibW91c2VsZWF2ZSIsZnVuY3Rpb24oZyl7dmFyIGM9ZC5nZXQoZy4kZGVjbGFyYXRpdmVQYXJlbnQpO2MmJiJvbm1vdXNlb3ZlciI9PT1jLmF0dHJzKCJhY3RpdmF0ZSIpJiYoYy5kZXN0cm95VGltZXI9Yi5kZWxheShmdW5jdGlvbigpe2MuaGlkZSgpfSwKMTI1KSl9KTtiLmRlY2xhcmF0aXZlKCJhLXRvb2x0aXAiLCJmb2N1cyBmb2N1c2luIixmdW5jdGlvbihiKXsoYj1kLmdldChiLiRkZWNsYXJhdGl2ZVBhcmVudCkpJiZiLnNob3coKX0pO2IuZGVjbGFyYXRpdmUoImEtdG9vbHRpcCIsImJsdXIgZm9jdXNvdXQiLGZ1bmN0aW9uKGIpeyhiPWQuZ2V0KGIuJGRlY2xhcmF0aXZlUGFyZW50KSkmJmIuaGlkZSgpfSl9KTsidXNlIHN0cmljdCI7bC53aGVuKCJBIiwiYS10b29sdGlwLWZhY3RvcnkiLCJhLXBvcG92ZXItYmFzZSIsImEtdG9vbHRpcC1oYW5kbGVycyIpLnJlZ2lzdGVyKCJhLXRvb2x0aXAiLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR9KX0pOwovKiAqKioqKioqKiAqLwooZnVuY3Rpb24oYyl7dmFyIGI9d2luZG93LkFtYXpvblVJUGFnZUpTfHx3aW5kb3cuUCxkPWIuX25hbWVzcGFjZXx8Yi5hdHRyaWJ1dGVFcnJvcnMsYT1kP2QoIkFtYXpvblVJQm90dG9tU2hlZXQiLCJBbWF6b25VSSIpOmI7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChjKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7YyhhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYixkKXt9KTsKLyogKioqKioqKiogKi8KKGZ1bmN0aW9uKGMpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBbWF6b25VSUNvbXBhdEpTIiwiQW1hem9uVUkiKTpiO2EuZ3VhcmRGYXRhbD9hLmd1YXJkRmF0YWwoYykoYSx3aW5kb3cpOmEuZXhlY3V0ZShmdW5jdGlvbigpe2MoYSx3aW5kb3cpfSl9KShmdW5jdGlvbihjLGIsZCl7fSk7Ci8qICoqKioqKioqICovCihmdW5jdGlvbihjKXt2YXIgYT13aW5kb3cuQW1hem9uVUlQYWdlSlN8fHdpbmRvdy5QLGQ9YS5fbmFtZXNwYWNlfHxhLmF0dHJpYnV0ZUVycm9ycyxiPWQ/ZCgiQW1hem9uVUkiLCJBbWF6b25VSSIpOmE7Yi5ndWFyZEZhdGFsP2IuZ3VhcmRGYXRhbChjKShiLHdpbmRvdyk6Yi5leGVjdXRlKGZ1bmN0aW9uKCl7YyhiLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYSxkKXthLnBjdj1hLnBjdnx8e307YS5wY3YuQW1hem9uVUk9ImY5YTM5NTFkMTA5N2MzOTkyN2VhMTRkODU0OTgyYjYyZmQ2OTkzODUifSk7Ci8qICoqKioqKioqICovCg==
Requested by
Host: www.studiojvd.com
URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
205.151.67.100 Salaberry-de-Valleyfield, Canada, ASN11290 (CC-3272, CA),
Reverse DNS
205-151-67-100.static.cgocable.ca
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash

Request headers

Referer
https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Fri, 24 Jul 2020 22:12:08 GMT
Server
nginx/1.14.0 (Ubuntu)
Connection
close
Content-Length
202
Content-Type
text/html
KGZ1bmN0aW9uKGMpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBdXRoZW50aWNhdGlvblNob3dQYXNzd29yZEFzc2V0cyIpOmI7YS5ndWFyZEZhdGFsP2EuZ3Vhc...
www.studiojvd.com/wp-content/themes/skanda/new/
0
0
Script
General
Full URL
https://www.studiojvd.com/wp-content/themes/skanda/new/KGZ1bmN0aW9uKGMpe3ZhciBiPXdpbmRvdy5BbWF6b25VSVBhZ2VKU3x8d2luZG93LlAsZD1iLl9uYW1lc3BhY2V8fGIuYXR0cmlidXRlRXJyb3JzLGE9ZD9kKCJBdXRoZW50aWNhdGlvblNob3dQYXNzd29yZEFzc2V0cyIpOmI7YS5ndWFyZEZhdGFsP2EuZ3VhcmRGYXRhbChjKShhLHdpbmRvdyk6YS5leGVjdXRlKGZ1bmN0aW9uKCl7YyhhLHdpbmRvdyl9KX0pKGZ1bmN0aW9uKGMsYixkKXt9KTs=
Requested by
Host: www.studiojvd.com
URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
205.151.67.100 Salaberry-de-Valleyfield, Canada, ASN11290 (CC-3272, CA),
Reverse DNS
205-151-67-100.static.cgocable.ca
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash

Request headers

Referer
https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Fri, 24 Jul 2020 22:12:08 GMT
Content-Encoding
gzip
Server
nginx/1.14.0 (Ubuntu)
Connection
keep-alive
Transfer-Encoding
chunked
Content-Type
text/html; charset=iso-8859-1
YXJiPSIrYzsic3RyaW5nIj09PXR5cGVvZiBrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy51ZXQmJndpbmRvdy51ZXQoImJiIixrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlLHt3YjoxfSk7YS5hamF4K...
www.studiojvd.com/wp-content/themes/skanda/new/UC5yZWdpc3RlcigiY3ZmVmVyc2lvbiIsZnVuY3Rpb24oKXtyZXR1cm57dmVyc2lvbjoiMC4xLjAuMC0yMDE3LTExLTExIn19KTsKUC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZW...
0
0
Script
General
Full URL
https://www.studiojvd.com/wp-content/themes/skanda/new/UC5yZWdpc3RlcigiY3ZmVmVyc2lvbiIsZnVuY3Rpb24oKXtyZXR1cm57dmVyc2lvbjoiMC4xLjAuMC0yMDE3LTExLTExIn19KTsKUC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLnJlZ2lzdGVyKCJjdmYtYWNjb3VudC1zd2l0Y2hlciIsZnVuY3Rpb24oYSxsKXtmdW5jdGlvbiBoKGIsZSl7Yi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBkPWwucmV0cmlldmVGb3JtRGF0YShiLnRhcmdldCksZz1kLmlucHV0RGF0YS5zZXJpYWxpemVBcnJheSgpO2cucHVzaChtKGIudGFyZ2V0KSk7YS5hamF4KHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCsiLy8iK3dpbmRvdy5sb2NhdGlvbi5ob3N0K2QucmVxdWVzdFBhdGgse21ldGhvZDoiUE9TVCIscGFyYW1zOmcsc3VjY2VzczplLGVycm9yOm59KX1mdW5jdGlvbiBtKGMpe2M9YihjKTt2YXIgZT1jLmF0dHIoIm5hbWUiKTtlfHwoZT1jLmNsb3Nlc3QoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1saW5rIikuYXR0cigiZGF0YS1uYW1lIikpO3ZhciBkPWMuYXR0cigidmFsdWUiKTtkfHwoZD1jLmNsb3Nlc3QoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1saW5rIikuYXR0cigiZGF0YS12YWx1ZSIpKTsKcmV0dXJue25hbWU6ZSx2YWx1ZTpkfX1mdW5jdGlvbiBuKGIsZSxkKXthLnRyaWdnZXIocC5lcnJvcixkKX1mdW5jdGlvbiBmKGMpe3ZhciBlPS8oW15AXHNdKylAKFthLXpBLVowLTlfLV0rKShcLlthLXpBLVowLTkuXy1dKykvaWcuZXhlYyhjKTtpZihudWxsIT09ZSl7Yz1lWzFdO2M9Yi50cmltKGMpO3ZhciBkPWMubGVuZ3RoO2lmKDEhPT1kKXtmb3IodmFyIGc9Yy5jaGFyQXQoMCksYT0wO2E8ZC0yO2ErKylnKz0iKiI7Yz1nKz1jLmNoYXJBdChkLTEpfWMrPSJAIjtnPWVbMl07Zz1iLnRyaW0oZyk7ZD1nLmxlbmd0aDtnPWcuY2hhckF0KDApO2ZvcihhPTA7YTxkLTE7YSsrKWcrPSIqIjtyZXR1cm4gYytnK2VbM119ZT1iLnRyaW0oYyk7Yz1lLmxlbmd0aDtpZighKDQ+PWMpKXtkPSIiO2ZvcihnPTA7ZzxjLTQ7ZysrKWQrPSIqIjtlPWQrZS5zdWJzdHIoYy00LGMtMSl9cmV0dXJuIGV9ZnVuY3Rpb24gcSgpezA9PT1iKCIuY3ZmLWFjY291bnQtc3dpdGNoZXItY2hlY2stbWFyazp2aXNpYmxlIikubGVuZ3RoJiYKKGIoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1jaGVjay1tYXJrLWFyZWEiKS5yZW1vdmUoKSxiKCIuY3ZmLWFjY291bnQtc3dpdGNoZXItcHJvZmlsZS1kZXRhaWxzIikudG9nZ2xlQ2xhc3MoImN2Zi1hY2NvdW50LXN3aXRjaGVyLXByb2ZpbGUtZGV0YWlscyBjdmYtYWNjb3VudC1zd2l0Y2hlci1wcm9maWxlLWRldGFpbHMtYWZ0ZXItYWNjb3VudC1yZW1vdmVkIikpfXZhciBiPWEuJCxwPXtzdWNjZXNzOiJjdmY6YWNjb3VudF9zd2l0Y2hlcjpzdWNjZXNzIixlcnJvcjoiY3ZmOmFjY291bnRfc3dpdGNoZXI6ZXJyb3IifTsoZnVuY3Rpb24oKXt2YXIgYz1iKCIjYXAtYWNjb3VudC1zd2l0Y2hlci1jb250YWluZXIiKVswXSxhPXdpbmRvdy5NdXRhdGlvbk9ic2VydmVyfHx3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtpZih2b2lkIDAhPT1jJiZ2b2lkIDAhPT1hKXt2YXIgZD1uZXcgYShmdW5jdGlvbihiKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZihudWxsIT09YlthXS5hZGRlZE5vZGVzKXtxKCk7CmQuZGlzY29ubmVjdCgpO2JyZWFrfX0pO2Qub2JzZXJ2ZShjLHthdHRyaWJ1dGVzOiEwLGNoaWxkTGlzdDohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITB9KX19KSgpOyhmdW5jdGlvbigpe2IoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1saW5rIikubGl2ZSgiY2xpY2siLGZ1bmN0aW9uKGMpe2goYyxmdW5jdGlvbihlKXtpZihlLnJlZGlyZWN0VXJsKXdpbmRvdy5sb2NhdGlvbj1lLnJlZGlyZWN0VXJsLGEudHJpZ2dlcigiY3ZmOmFjY291bnRfc3dpdGNoZXIiLCJyZWRpcmVjdE9uU2lnbk91dCIpO2Vsc2UgaWYoZS5zdWNjZWVkZWQpe3ZhciBkPSIuIitiKGMudGFyZ2V0KS5hdHRyKCJjbGFzcyIpLm1hdGNoKC9jdmYtYWNjb3VudC1zd2l0Y2hlci1hY2NvdW50LWdyb3VwLVx3Ky9nKVswXTtiKGQrIi1oaWRlIikuaGlkZSgpO2IoZCsiLW5hbWUiKS50ZXh0KGIoIiNjdmYtYWNjb3VudC1zd2l0Y2hlci1zaWduLW91dC1yZXBsYWNlLXRleHQiKS50ZXh0KCkpO2IoZCsKIi1jbGFpbSIpLnRleHQoZihiKGQrIi1jbGFpbSIpLnRleHQoKSkpO2IoZCsiLWltYWdlIikucmVwbGFjZVdpdGgoYigiPGRpdiAvPiIpLmFwcGVuZChiKCIjY3ZmLWFjY291bnQtc3dpdGNoZXItc2lnbi1vdXQtcmVwbGFjZS1pbWFnZSIpLmNsb25lKCkucmVtb3ZlQ2xhc3MoImN2Zi1oaWRkZW4iKSkuaHRtbCgpKTtiKGQrIi1idXR0b24iKS5yZW1vdmVDbGFzcygiY3ZmLXdpZGdldC1idG4tdmFsIGN2Zi13aWRnZXQtYnRuLXZlcmlmeS1hY2NvdW50LXN3aXRjaGVyIik7ZT1lLnN3aXRjaGVkQWNjb3VudElkO3ZvaWQgMCE9PWUmJmIoIi5jdmYtYWNjb3VudC1zd2l0Y2hlci1hY2NvdW50LWdyb3VwLSIrZSsiLWNoZWNrLW1hcmsiKS5zaG93KCk7cSgpfWVsc2UgYS50cmlnZ2VyKHAuZXJyb3IsZSl9KX0pfSkoKX0pOwpQLndoZW4oIkEiLCJjdmZWZXJzaW9uIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLnJlZ2lzdGVyKCJjdmYiLGZ1bmN0aW9uKGEsbCxoKXtmdW5jdGlvbiBtKGMpe2Z1bmN0aW9uIGUoYil7InN0cmluZyI9PT10eXBlb2Ygay5vcHRpb25zLndpZGdldE1ldHJpY3NTY29wZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cudWV0JiZ3aW5kb3cudWV4KCJsZCIsay5vcHRpb25zLndpZGdldE1ldHJpY3NTY29wZSx7d2I6MX0pO2sub3B0aW9ucy5zcGlubmVyVGFyZ2V0JiZrLm9wdGlvbnMuc3Bpbm5lclRhcmdldC5oaWRlKCk7Yi5oYXNPd25Qcm9wZXJ0eSgiZXJyb3IiKT9hLnRyaWdnZXIodC5lcnJvcixiLmVycm9yKTpiLnJlZGlyZWN0VXJsP3dpbmRvdy5sb2NhdGlvbj1iLnJlZGlyZWN0VXJsOmIucmVkaXJlY3Q/KGEudHJpZ2dlcih0LnN1Y2Nlc3MsYi50b2tlbixiLnN0YXR1cyxiLnJlZGlyZWN0KSxrLm9wdGlvbnMuYXV0b0Rlc3Ryb3k/ay5kZXN0cm95KCk6KGYoIi5jdmYtd2lkZ2V0LWFsZXJ0IikuaGlkZSgpLApiLnN0YXR1cz9mKCIuY3ZmLXdpZGdldC1zdGF0dXMtc3VjY2VzcyIpLnNob3coKTpmKCIuY3ZmLXdpZGdldC1zdGF0dXMtZXJyb3IiKS5zaG93KCkseSgpKSxhLnRyaWdnZXIoImN2Zjp2ZXJpZmljYXRpb246Y29tcGxldGUiLGIuc3RhdHVzKSxyLmZpbmQoIi5jdmYtd2lkZ2V0LWJ0biIpLnVuYmluZCgiY2xpY2siLGQpLHIuZmluZCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLnVuYmluZCgiY2xpY2siLGQpLGEub2ZmKHQuc3VjY2VzcyksYS5vZmYodC5lcnJvcikpOihyLmh0bWwoYi5yZXBsYWNlKC88Zm9ybS9nLCI8ZGl2IikucmVwbGFjZSgvPFwvZm9ybS9nLCI8L2RpdiIpKSxtKCkpfWZ1bmN0aW9uIGQoYixkKXtiLnByZXZlbnREZWZhdWx0KCk7ZigiLmN2Zi13aWRnZXQtYWxlcnQiKS5oaWRlKCk7ay5vcHRpb25zLnNwaW5uZXJUYXJnZXQmJmsub3B0aW9ucy5zcGlubmVyVGFyZ2V0LnNob3coKTt2YXIgYz1oLnJldHJpZXZlRm9ybURhdGEoYi50YXJnZXQpLGc9Yy5pbnB1dERhdGEuc2VyaWFsaXplQXJyYXkoKTsKZCYmZy5wdXNoKGguZ2V0TmFtZVZhbHVlKGIudGFyZ2V0KSk7YS5hamF4KHUrYy5yZXF1ZXN0UGF0aCx7bWV0aG9kOiJQT1NUIixwYXJhbXM6ZyxzdWNjZXNzOmUsZXJyb3I6bn0pfWZ1bmN0aW9uIGcoYil7MTM9PT1iLmtleUNvZGUmJmQoYil9ZnVuY3Rpb24gbSgpe3IuZmluZCgiLmN2Zi13aWRnZXQtYnRuIikuY2xpY2soZnVuY3Rpb24oYil7ZChiLCExKX0pO3IuZmluZCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLmNsaWNrKGZ1bmN0aW9uKGIpe2QoYiwhMCl9KTtyLmZpbmQoJ2lucHV0W25hbWU9ImNvZGUiXScpLmZvY3VzKCkua2V5cHJlc3MoZyl9ZnVuY3Rpb24gbChiKXtyZXR1cm4gZnVuY3Rpb24oZCxjLGcpeyJ0aW1lb3V0IiE9PWN8fDM8PXg/YS50cmlnZ2VyKHQuZXJyb3IsZyk6YS5kZWxheShiLDEwKngrKyl9fWZ1bmN0aW9uIG4oYixkLGMpe2sub3B0aW9ucy5zcGlubmVyVGFyZ2V0JiZrLm9wdGlvbnMuc3Bpbm5lclRhcmdldC5oaWRlKCk7YS50cmlnZ2VyKHQuZXJyb3IsCmMpfWZ1bmN0aW9uIHkoKXtmLmVhY2goci5maW5kKCJpbnB1dCIpLGZ1bmN0aW9uKGIsZCl7dmFyIGM9ZihkKTtjLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTtjLmhhc0NsYXNzKCJhLWlucHV0LXRleHQiKT9jLmFkZENsYXNzKCJhLWZvcm0tZGlzYWJsZWQiKTpjLmhhc0NsYXNzKCJhLWJ1dHRvbi1pbnB1dCIpP2MuY2xvc2VzdCgiLmEtYnV0dG9uIikuYWRkQ2xhc3MoImEtYnV0dG9uLWRpc2FibGVkIik6Yy5jbG9zZXN0KCIuYS1pbnB1dC10ZXh0LXdyYXBwZXIiKS5sZW5ndGgmJmMuY2xvc2VzdCgiLmEtaW5wdXQtdGV4dC13cmFwcGVyIikuYWRkQ2xhc3MoImEtZm9ybS1kaXNhYmxlZCIpfSk7Zi5lYWNoKHIuZmluZCgiYSIpLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ZihjKTtkLmhhc0NsYXNzKCJjdmYtd2lkZ2V0LWxpbmstZGlzYWJsZS10YXJnZXQiKSYmZC5hZGRDbGFzcygiY3ZmLWxpbmstZGlzYWJsZWQiKX0pfXZhciBrPXRoaXM7YisrO3ZhciB0PXtzdWNjZXNzOiJjdmY6IisKYisiOnN1Y2Nlc3MiLGVycm9yOiJjdmY6IitiKyI6ZXJyb3IifTtrLm9wdGlvbnM9e307Zi5leHRlbmQoay5vcHRpb25zLHEsYyk7KGZ1bmN0aW9uKGIpe2lmKDEhPT1mKGIudGFyZ2V0KS5sZW5ndGgpdGhyb3cgRXJyb3IoIlRoZSBDVkYgd2lkZ2V0IHJlcXVpcmVzIGEgdW5pcXVlIGVsZW1lbnQuIik7aWYoIWYuaXNGdW5jdGlvbihiLm9uU3VjY2VzcykpdGhyb3cgRXJyb3IoIlRoZSBDVkYgd2lkZ2V0IHJlcXVpcmVzIGEgc3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbi4iKTtpZighZi5pc0Z1bmN0aW9uKGIub25FcnJvcikpdGhyb3cgRXJyb3IoIlRoZSBDVkYgd2lkZ2V0IHJlcXVpcmVzIGFuIGVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uLiIpO30pKGsub3B0aW9ucyk7dmFyIHU9ay5vcHRpb25zLnNlcnZlcixyPWYoay5vcHRpb25zLnRhcmdldCk7YS5vbih0LnN1Y2Nlc3Msay5vcHRpb25zLm9uU3VjY2Vzcyk7YS5vbih0LmVycm9yLGsub3B0aW9ucy5vbkVycm9yKTtrLnN0YXJ0PWZ1bmN0aW9uKCl7aWYoMD09PQpmLnRyaW0oay5vcHRpb25zLnJlcXVlc3RUb2tlbikubGVuZ3RoKXRocm93IEVycm9yKCJUaGUgQ1ZGIHdpZGdldCByZXF1aXJlcyBhIHJlcXVlc3QgdG9rZW4uIik7dmFyIGI7Yj1rLm9wdGlvbnMucmVxdWVzdFRva2VuO3ZhciBjPWsub3B0aW9ucy5yZXF1ZXN0QXJiVG9rZW47Yj0wPT09Zi50cmltKGMpLmxlbmd0aD91KyIvYXAvY3ZmL3JlcXVlc3QuZW1iZWQ/cmVxdWVzdFRva2VuPSIrYjp1KyIvYXAvY3ZmL3JlcXVlc3QuZW1iZWQ/YXJiPSIrYzsic3RyaW5nIj09PXR5cGVvZiBrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy51ZXQmJndpbmRvdy51ZXQoImJiIixrLm9wdGlvbnMud2lkZ2V0TWV0cmljc1Njb3BlLHt3YjoxfSk7YS5hamF4KGIse21ldGhvZDoiR0VUIixwYXJhbXM6cCxzdWNjZXNzOmUsZXJyb3I6bChrLnN0YXJ0KX0pfTtrLmRlc3Ryb3k9ZnVuY3Rpb24oKXtyLmh0bWwoIiIpfTttKCk7dmFyIHg9MDtrLm9wdGlvbnMuYXV0b1N0YXJ0JiYKay5zdGFydCgpfWZ1bmN0aW9uIG4oYil7cmV0dXJuIG5ldyBtKGIpfXZhciBmPWEuJCxxPXtzZXJ2ZXI6IiIsdGFyZ2V0OnZvaWQgMCxyZXF1ZXN0VG9rZW46dm9pZCAwLHJlcXVlc3RBcmJUb2tlbjp2b2lkIDAsb25TdWNjZXNzOnZvaWQgMCxvbkVycm9yOnZvaWQgMCxzcGlubmVyVGFyZ2V0OnZvaWQgMCxhdXRvU3RhcnQ6ITAsYXV0b0Rlc3Ryb3k6ITAsd2lkZ2V0TWV0cmljc1Njb3BlOnZvaWQgMH0sYj0wLHA9W3tuYW1lOiJDVkZWZXJzaW9uIix2YWx1ZTpsLnZlcnNpb259LHtuYW1lOiJBVUlWZXJzaW9uIix2YWx1ZTpQLkFVSV9CVUlMRF9EQVRFfV07YS5vbigiY3ZmOnZlcmlmaWNhdGlvbjpyZXF1ZXN0IixmdW5jdGlvbihiKXt2YXIgZT1mKCIjIitiKSxkPWUuZGF0YSgidG9rZW4iKSxnPWUuZGF0YSgic3Bpbm5lcklkIiksZz1mKCIjIitnKTtuKHt0YXJnZXQ6ZSxzcGlubmVyVGFyZ2V0OmcscmVxdWVzdFRva2VuOmQsb25TdWNjZXNzOmZ1bmN0aW9uKGQsZyxlKXthLnRyaWdnZXIoImN2Zjp2ZXJpZmljYXRpb246Y29tcGxldGU6IisKYixkLGcsZSl9LG9uRXJyb3I6ZnVuY3Rpb24oZCl7YS50cmlnZ2VyKCJjdmY6dmVyaWZpY2F0aW9uOmVycm9yOiIrYixkKX0sYXV0b1N0YXJ0OiEwLGF1dG9EZXN0cm95OiExfSl9KTtyZXR1cm57Y3JlYXRlOm59fSk7ClAud2hlbigiQSIsImN2ZiIsInJlYWR5IikuZXhlY3V0ZShmdW5jdGlvbihhLGwpe3ZhciBoPWEuJDtoKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjLGUpe3dpbmRvdy5sb2NhdGlvbj1lO2NvbnNvbGUubG9nKCJDbGllbnQgU2lkZTogIitiKX1mdW5jdGlvbiBuKGIpe2NvbnNvbGUubG9nKGIpfXZhciBmPWgoIi5jdmYtd2lkZ2V0LXNwaW5uZXIiKSxxPWgoIiNjdmYtd2lkZ2V0LWNvbnRlbnQiKTtpZigxPT09cS5sZW5ndGgpe3ZhciBiPWgoJ1tuYW1lPSJyZXF1ZXN0VG9rZW4iXScpLmZpcnN0KCkuYXR0cigidmFsdWUiKTtsLmNyZWF0ZSh7dGFyZ2V0OnEsc3Bpbm5lclRhcmdldDpmLHJlcXVlc3RUb2tlbjpiLG9uU3VjY2VzczphLG9uRXJyb3I6bixhdXRvU3RhcnQ6ITF9KX19KX0pOwpQLndoZW4oIkEiKS5leGVjdXRlKGZ1bmN0aW9uKGEpe2EuZGVjbGFyYXRpdmUoImF1dGgtcG9wdXAiLCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIGg9YS5kYXRhO2E9YS4kdGFyZ2V0LmNsb3Nlc3QoImEiKVswXTsoaD13aW5kb3cub3BlbihhLmhyZWYsYS50YXJnZXQsaC53aW5kb3dPcHRpb25zKSkmJmguZm9jdXMoKX0pfSk7UC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLmV4ZWN1dGUoZnVuY3Rpb24oYSxsKXt9KTsKUC53aGVuKCJBIiwiY3ZmRm9ybURhdGFHZW5lcmF0b3IiLCJyZWFkeSIpLmV4ZWN1dGUoZnVuY3Rpb24oYSxsKXt2YXIgaD1hLiQ7aCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLmNsaWNrKGZ1bmN0aW9uKGEpe3ZhciBuPWgoYS50YXJnZXQpLmNsb3Nlc3QoIi5jdmYtd2lkZ2V0LWZvcm0iKTthPWwuZ2V0TmFtZVZhbHVlKGgoYS50YXJnZXQpKTtuLmFwcGVuZCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJythLm5hbWUrJyIgdmFsdWU9IicrYS52YWx1ZSsnIj4nKS5zdWJtaXQoKX0pfSk7ClAud2hlbigiQSIsInJlYWR5IikucmVnaXN0ZXIoImN2ZkZvcm1EYXRhR2VuZXJhdG9yIixmdW5jdGlvbihhKXt2YXIgbD1hLiQ7cmV0dXJue3JldHJpZXZlRm9ybURhdGE6ZnVuY3Rpb24oYSl7YT1sKGEpLmNsb3Nlc3QoIi5jdmYtd2lkZ2V0LWZvcm0iKTtyZXR1cm57cmVxdWVzdFBhdGg6YS5kYXRhKCJ1c2Utb25seS1mb3JtLWFjdGlvbiIpP2EuYXR0cigiYWN0aW9uIik6Ii9hcC9jdmYvIithLmF0dHIoImFjdGlvbiIpKyIuZW1iZWQiLGlucHV0RGF0YTphLmZpbmQoIi5jdmYtd2lkZ2V0LWlucHV0LC5jdmYtd2lkZ2V0LWhpZGRlbi1maWVsZHMsLmN2Zi13aWRnZXQtaW5wdXQgOmlucHV0IiksZm9ybTphfX0sZ2V0TmFtZVZhbHVlOmZ1bmN0aW9uKGEpe2E9bChhKTt2YXIgbT1hLmF0dHIoIm5hbWUiKTttfHwobT1hLmNsb3Nlc3QoIi5jdmYtd2lkZ2V0LWJ0bi12YWwiKS5hdHRyKCJkYXRhLW5hbWUiKSk7dmFyIG49YS5hdHRyKCJ2YWx1ZSIpO258fChuPWEuY2xvc2VzdCgiLmN2Zi13aWRnZXQtYnRuLXZhbCIpLmF0dHIoImRhdGEtdmFsdWUiKSk7CnJldHVybntuYW1lOm0sdmFsdWU6bn19fX0pO1Aud2hlbigiQSIsInJlYWR5IikucmVnaXN0ZXIoImNvZGVSZXNlbmRUaW1lciIsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbChoLG0sbil7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCksbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLWYsYj1oLWI7aWYoMD49YiljbGVhckludGVydmFsKGwpLGEuJCgiI3RpbWVyIikuaHRtbChuKTtlbHNle3ZhciBiPU1hdGguZmxvb3IoYi8xRTMpLHA9bS5zcGxpdCgiICt0aW1lbGVmdCsgIiksYj1wWzBdLnNwbGl0KCciJykuam9pbigiIikrYitwWzFdLnNwbGl0KCciJykuam9pbigiIik7YS4kKCIjdGltZXIiKS5odG1sKGIpfX0sMTAwKX1yZXR1cm57Y3JlYXRlVGltZXI6ZnVuY3Rpb24oYSxtLG4pe3JldHVybiBuZXcgbChhLG0sbil9fX0pOw==
Requested by
Host: www.studiojvd.com
URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
205.151.67.100 Salaberry-de-Valleyfield, Canada, ASN11290 (CC-3272, CA),
Reverse DNS
205-151-67-100.static.cgocable.ca
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash

Request headers

Referer
https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Fri, 24 Jul 2020 22:12:08 GMT
Server
nginx/1.14.0 (Ubuntu)
Connection
close
Content-Length
202
Content-Type
text/html

Verdicts & Comments Add Verdict or Comment

Potentially malicious activity detected
Disclaimer: These verdicts should be used to detect potentially malicious websites, not as a final verdict!

urlscan

Phishing against: Amazon (Online)

1 JavaScript Global Variables

These are the non-standard "global" variables defined on the window object. These can be helpful in identifying possible client-side frameworks and code.

number| aPageStart

0 Cookies

6 Console Messages

Source Level URL
Text
console-api log URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm(Line 17)
Message:
[object Object]
console-api error URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm(Line 17)
Message:
null
console-api log URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm(Line 17)
Message:
[object Object]
console-api error URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm(Line 17)
Message:
null
console-api log URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm(Line 17)
Message:
[object Object]
console-api error URL: https://www.studiojvd.com/wp-content/themes/skanda/new/verifying.htm(Line 17)
Message:
null