GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
/
Show response
www.golem.de/
Redirect Chain
-
http://golem.de/
-
https://www.golem.de/
|
188 KB
43 KB
|
413ms
368ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_130-min.css
www.golem.de/staticrl/styles/
|
73 KB
20 KB
|
47ms
16ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
metaTag.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
|
250 KB
61 KB
|
160ms
6ms
|
Script
application/javascript |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
logo-g.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
59ms
14ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144193-210380-210378_rc.jpg
www.golem.de/1910/
|
23 KB
23 KB
|
59ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144463-211670-211667_rc.jpg
www.golem.de/1910/
|
6 KB
6 KB
|
31ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144454-211623-211620_rc.jpg
www.golem.de/1910/
|
8 KB
9 KB
|
31ms
21ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144461-211661-211658_rc.jpg
www.golem.de/1910/
|
7 KB
7 KB
|
21ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144458-211643-211640_rc.jpg
www.golem.de/1910/
|
10 KB
11 KB
|
21ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144192-210377-210376_rc.jpg
www.golem.de/1910/
|
7 KB
8 KB
|
22ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
71ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
tesla-zeigt-crashtest-des-model-3-(herstellervideo).jpg
video.golem.de/teaser/1/1/23648/thumb-high-1000/
|
83 KB
83 KB
|
69ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
terminator6-snap.jpg
video.golem.de/teaser/1/1/23623/thumb-high-1000/
|
68 KB
69 KB
|
59ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
56ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144382-211301-211300_rc.jpg
www.golem.de/1910/
|
123 KB
123 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144375-211265-211262_rc.jpg
www.golem.de/1910/
|
74 KB
74 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
190923-golem_Seminar_Zeitmanagment_h.jpg
www.golem.de/_img/
|
295 KB
295 KB
|
26ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.js
Show response
www.golem.de/staticrl/scripts/
|
100 KB
41 KB
|
16ms
16ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
longread-swiper_131-min.js
Show response
www.golem.de/staticrl/scripts/
|
2 KB
1 KB
|
17ms
16ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
account_js_dt18_1_0.php
Show response
www.golem.de/abo/
|
88 B
576 B
|
22ms
15ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sdcv.js
Show response
ads.golem.de/
|
63 B
402 B
|
58ms
14ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
34 KB
11 KB
|
30ms
10ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
45 KB
15 KB
|
29ms
17ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
274 KB
84 KB
|
37ms
8ms
|
Script
application/javascript |
13.225.78.17
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
22ms
6ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
97 B
598 B
|
50ms
50ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
-
https://nugmw.userreport.com/rc-ap/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
|
2 KB
2 KB
|
35ms
19ms
|
Script
text/javascript |
2600:9000:2156:b800:1f:a1b:34c0:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
|
22 KB
22 KB
|
15ms
14ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
|
22 KB
22 KB
|
15ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
|
21 KB
21 KB
|
15ms
14ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
325 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
258 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
|
20 KB
20 KB
|
15ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
126 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
147 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
153 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
18ms
17ms
|
Script
application/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
19ms
18ms
|
Script
application/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019100301.js
Show response
securepubads.g.doubleclick.net/gpt/
|
157 KB
58 KB
|
18ms
18ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb82.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
12ms
1ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/bb-mx/submit?/BXZRBGAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwS+GBPAAAAAAAAAOAAAAGBAAAAAAZwS+GBBRksFAQtjFMS2qSA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
11ms
0ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
|
49 B
482 B
|
27ms
13ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
19ms
6ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
btn-follow-sp4b.png
www.golem.de/staticrl/images/
|
3 KB
3 KB
|
15ms
15ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
103 KB
36 KB
|
23ms
22ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
golem_csi-121-min.js
Show response
www.golem.de/staticrl/scripts/adsense/
|
2 KB
1 KB
|
15ms
15ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
/
Show response
adx.adform.net/adx/
|
10 B
407 B
|
101ms
57ms
|
XHR
application/json |
37.157.4.40
ADFORM
|
|
General
- Full URL
- https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPWY1ZWFkNDllLTc0YjktNDY2Ni1hYmRjLTM0OWEzZWI0MGYxZg%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPTYzY2U2MjE1LWIyZGMtNGI0Ni05ODNmLTZmOGM2Mjc5MDk4Mw%3D%3D&pt=gross&stid=2338bfc5-c696-4e18-9381-db90e8c2c73f&fd=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.4.40
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
10 KB
11 KB
|
49ms
32ms
|
XHR
application/json |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=b5bd8b72-6825-4562-b38b-98a856b7cb36%2Cf5ead49e-74b9-4666-abdc-349a3eb40f1f%2C08957a53-3bec-4078-9094-e540bdd29a25%2C63ce6215-b2dc-4b46-983f-6f8c62790983%2C080ea5af-47f0-40e1-8c41-ed52f5db9172&nocache=1571290753392&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%2C301x601%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner%2Cbillboard2&auid=540523394%2C540523392%2C540523393%2C540523387%2C540651907&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.163.0 /
- Resource Hash
- bb1e75f1c4466db6b292509996b6a61ecd7ce1e82dcec81cdcac205a458b49df
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
495 B
1 KB
|
51ms
21ms
|
XHR
application/json |
185.33.223.209
AppNexus
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
145 B
|
66ms
36ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
146 B
|
57ms
27ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
145 B
|
58ms
28ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
145 B
|
67ms
37ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
145 B
|
57ms
28ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
25 B
902 B
|
241ms
230ms
|
XHR
application/json |
2.18.234.21
Akamai Technologies
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=335654&v=7.2&r=%7B%22id%22%3A%22218e07ed9cb1b5d%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2222c88f905b8c7c9%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22335654%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%22236e706451f075c%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2224c638b4c18e275%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2225b7709a3e703d7%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2226a6a495afd907b%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%222713479c052736a%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%22286dd76fb06879d%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2229e141bf3fa2e7b%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2230003d9119560fc%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%2231b827beb2b7c05%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22326a9701a51ae45%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22334dfd713e9b4ed%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.21
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-21.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- 2685d1e4e2343fcdf261a63df17cad548cd0452c75eca62b62a003a37abaf392
|
POST
H2
|
204
|
v1
Show response
dmx.districtm.io/b/
|
0
416 B
|
121ms
108ms
|
XHR
text/plain |
104.16.190.66
Cloudflare
|
|
General
- Full URL
- https://dmx.districtm.io/b/v1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.190.66
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
114 B
|
111ms
84ms
|
XHR
text/plain |
185.64.189.112
PubMatic
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
81 KB
16 KB
|
396ms
396ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=12599419205633&correlator=669847447326201&output=ldjh&impl=fifs&adsid=NT&eid=21063636&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191017&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31%2C20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32%2C800x450%7C580x500%7C580x360%7C42x31%2C10x10%7C301x250%7C300x126%7C34x32&prev_scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17298.default%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband%7Cas%3Dbanner%26adslot%3Dbanner%26pc%3D1%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17295.default%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17299.default%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%7Cas%3Dbillboard2%26adslot%3Dbillboard2%26pc%3D1%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A18494.default%26yieldlove_meta%3Dpid%253A18494.sb%253Af%26yieldlove_pid%3D18494%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%7Cas%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt%7Cas%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17300.default%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3Db302346b0322fd916af0223f63c2321d%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-1%252Cn19-2%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-5%252Cn137-0%252Cn101-1%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-1%252Cn107-1%252Cn21-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-1%252Cn9-0%252Cn23-1%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-3%252Cn90-0%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-1%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-1%252Cn82-1%252Cn33-1%252Cn84-1%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-0&cookie_enabled=1&bc=31&abxe=1&lmt=1571290753&dt=1571290753415&dlt=1571290753016&idt=312&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933&adys=-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933&adks=3761801772%2C2546325955%2C2740773112%2C366944190%2C3564596220%2C2251274322&ucis=1%7C2%7C3%7C4%7C5%7C6&ifi=1&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=34&icsg=243312703&std=0&csl=340&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x0%7C1000x0%7C300x0%7C1000x0%7C1000x0%7C300x2&msz=10x40%7C20x10%7C10x20%7C20x10%7C800x450%7C10x10&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&fws=128%2C128%2C128%2C128%2C128%2C128&ohw=0%2C0%2C0%2C0%2C0%2C0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 199f635f74f535f28731dd7d665b9ea95a31f07e0453e3913d04c126e4f3a8e4
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019100301.js
Show response
securepubads.g.doubleclick.net/gpt/
|
63 KB
24 KB
|
17ms
16ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
|
0
0
|
7ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H/1.1
|
200
OK
|
gx-ads.js
Show response
ads.golem.de/track.ads/
|
226 B
566 B
|
14ms
14ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
|
40 KB
9 KB
|
17ms
5ms
|
Script
text/javascript |
151.101.113.194
Fastly
|
|
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/
|
238 KB
88 KB
|
28ms
28ms
|
Script
text/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 1a58095266eb45b55188805f4507e88c0fa62d1fc111b67585e98a9f8b1c4e4e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191015/r20190131/
Frame 8149
|
0
0
|
5ms
5ms
|
Document
text/html |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20191015/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201910111253/
|
28 KB
11 KB
|
5ms
5ms
|
Script
application/javascript |
151.101.113.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201910111253/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.113.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 92d1994cace793adb74ca4a9e69eb746448b20aac8fd7124b03fb95694761187
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&...
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&...
|
0
694 B
|
10ms
10ms
|
Script
application/x-javascript |
91.215.100.40
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&i3=00131280b4dc4fce95da7fe81%3A1597556353510%3A1571290753510%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1571290753510&n1=2&dntt=0<=1571290753511&ev=&cs=48b8a9&mo=1&sr=71
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.100.40
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de4.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.05.0 0025
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
IjvnOpbzskTW
Show response
cdn.onthe.io/io.js/
|
72 KB
27 KB
|
14ms
6ms
|
Script
text/javascript |
116.202.11.240
HETZNER-AS
|
|
|
GET
H2
|
200
|
js
Show response
www.googletagmanager.com/gtag/
|
74 KB
28 KB
|
16ms
16ms
|
Script
application/javascript |
2a00:1450:4001:814::2008
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
146005_67aa4bdf07fc8a6dd839add1ec7302a1
Show response
lib.selfcampaign.com/tag/
|
10 KB
4 KB
|
32ms
23ms
|
Script
text/javascript |
148.251.131.173
HETZNER-AS
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
20ms
6ms
|
Script
application/javascript |
2600:9000:20eb:ee00:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
29ms
29ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n19=2&n121=2&n116=0&n104=1&n15=1&n155=1&n106=1&n52=2&n153=1&n11=1&n120=2&n154=1&n125=1&n8=5&n137=0&n101=1&n108=0&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n60=1&n139=0&n160=1&n107=1&n21=1&n117=2&n86=0&n147=4&n64=0&n119=1&n18=1&n161=1&n126=1&n92=2&n62=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=0&n12=6&n141=0&n157=0&n99=1&n128=2&n118=6&n85=1&n9=0&n23=1&n6=2&n63=0&n58=1&n38=2&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=3&n90=0&n43=1&n142=0&n7=2&n103=0&n158=1&n124=1&n75=1&n91=0&n46=1&n114=1&n69=0&n10=1&n3=1&n82=1&n33=1&n84=1&n5=5&n109=0&n122=1&n67=0&n115=1&n89=2&n123=2&n17=1&n78=0&n44=1&n81=1&n88=1&n39=1&n156=1&n148=0
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 4f62b577f2c8c16a3db499d50478c468dc84a8336f70c0602671d48c31f8a4aa
|
GET
H/1.1
|
200
OK
|
swiper-4.2.2.custom.min.js
Show response
www.golem.de/staticrl/scripts/external/
|
69 KB
23 KB
|
16ms
16ms
|
XHR
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_cpxl_113-min.js
Show response
www.golem.de/staticrl/scripts/
|
8 KB
4 KB
|
15ms
15ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
crg9-snap.jpg
video.golem.de/teaser/1/1/23641/thumb-high-1000/
|
144 KB
144 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cinema-4d-demo-reel-2019-(maxon).jpg
video.golem.de/teaser/1/1/23642/thumb-high-1000/
|
122 KB
123 KB
|
16ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
pixel4-snap_1.5.1.jpg
video.golem.de/teaser/1/1/23643/thumb-high-1000/
|
80 KB
81 KB
|
41ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144460-211657-211654_rc.jpg
www.golem.de/1910/
|
5 KB
6 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144459-211653-211649_rc.jpg
www.golem.de/1910/
|
6 KB
6 KB
|
17ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144451-211614-211611_rc.jpg
www.golem.de/1910/
|
6 KB
6 KB
|
17ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144373-211260-211257_rc.jpg
www.golem.de/1910/
|
6 KB
7 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144456-211635-211632_rc.jpg
www.golem.de/1910/
|
6 KB
7 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144442-211585-211584_rc.jpg
www.golem.de/1910/
|
4 KB
5 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144424-211488-211485_rc.jpg
www.golem.de/1910/
|
4 KB
4 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144457-211639-211636_rc.jpg
www.golem.de/1910/
|
7 KB
8 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144418-211463-211461_rc.jpg
www.golem.de/1910/
|
7 KB
7 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144439-211558-211555_rc.jpg
www.golem.de/1910/
|
5 KB
5 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144455-211631-211628_rc.jpg
www.golem.de/1910/
|
7 KB
7 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144428-211511-211510_rc.jpg
www.golem.de/1910/
|
9 KB
9 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144436-211550-211547_rc.jpg
www.golem.de/1910/
|
7 KB
7 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144392-211396-211395_rc.jpg
www.golem.de/1910/
|
8 KB
8 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144453-211627-211624_rc.jpg
www.golem.de/1910/
|
8 KB
9 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144426-211496-211493_rc.jpg
www.golem.de/1910/
|
9 KB
9 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144452-211619-211618_rc.jpg
www.golem.de/1910/
|
7 KB
8 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144435-211546-211543_rc.jpg
www.golem.de/1910/
|
9 KB
9 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144450-211610-211607_rc.jpg
www.golem.de/1910/
|
7 KB
8 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
143527-207047-207044_rc.jpg
www.golem.de/1910/
|
5 KB
6 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
143420-206525-206522_rc.jpg
www.golem.de/1910/
|
7 KB
7 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144447-211598-211597_rc.jpg
www.golem.de/1910/
|
8 KB
9 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
143431-208147-208144_rc.jpg
www.golem.de/1910/
|
7 KB
7 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144448-211602-211599_rc.jpg
www.golem.de/1910/
|
9 KB
9 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144449-211606-211603_rc.jpg
www.golem.de/1910/
|
5 KB
5 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144446-211593-211590_rc.jpg
www.golem.de/1910/
|
7 KB
7 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144445-211580-211577_rc.jpg
www.golem.de/1910/
|
6 KB
7 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144317-211139-211137_rc.jpg
www.golem.de/1910/
|
21 KB
21 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_141848-205483-205481_rc.jpg
www.golem.de/1910/
|
22 KB
22 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144319-211110-211108_rc.jpg
www.golem.de/1910/
|
17 KB
18 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143671-207893-207888_rc.jpg
www.golem.de/1910/
|
26 KB
26 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143624-208141-208139_rc.jpg
www.golem.de/1910/
|
30 KB
30 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144237-210698-210696_rc.jpg
www.golem.de/1910/
|
20 KB
20 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144263-210743-210741_rc.jpg
www.golem.de/1910/
|
20 KB
20 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144231-210635-210633_rc.jpg
www.golem.de/1910/
|
20 KB
20 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144197-210474-210472_rc.jpg
www.golem.de/1910/
|
24 KB
24 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144199-210537-210535_rc.jpg
www.golem.de/1910/
|
18 KB
18 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144153-210287-210285_rc.jpg
www.golem.de/1910/
|
18 KB
18 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143458-206815-206813_rc.jpg
www.golem.de/1909/
|
17 KB
17 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144156-210302-210299_rc.jpg
www.golem.de/1910/
|
16 KB
16 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_144145-210123-210121_rc.jpg
www.golem.de/1909/
|
26 KB
26 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143447-209772-209770_rc.jpg
www.golem.de/1909/
|
28 KB
28 KB
|
14ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cpx.php
cpx.golem.de/
|
42 B
420 B
|
386ms
38ms
|
Image
image/gif |
77.247.84.149
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame D54C
|
0
0
|
273ms
273ms
|
Document
text/html |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753466&bpp=7&bdt=450&fdt=92&idt=92&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&correlator=4674202752223&frm=20&pv=2&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3946&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=8&uci=a!8&fsb=1&xpc=b6SUb5MIFk&p=https%3A//www.golem.de&dtd=103
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
77 KB
28 KB
|
16ms
16ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f425f66d90f1150499b36ab47b56fa6fb1a68136e4f42befca20a920ff85306b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
rmpslider-rl_131-min.js
Show response
www.golem.de/staticrl/scripts/radiant/
|
21 KB
9 KB
|
22ms
15ms
|
XHR
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
5ms
0ms
|
XHR
text/javascript |
188.40.118.169
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:ee461804c.8c29f55c6_1571290753632,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1571290753634
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/uniques/
|
33 B
515 B
|
4ms
1ms
|
Script
text/html |
188.40.118.169
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
5ms
3ms
|
XHR
text/javascript |
188.40.118.169
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:ee461804c.8c29f55c6_1571290753632,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=ee461804c.8c29f55c6_1571290753632&1571290753637
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
3ms
1ms
|
XHR
text/javascript |
188.40.118.169
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:ee461804c.8c29f55c6_1571290753632,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1571290753640
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
sp_EME4-659016_rc.jpg
www.golem.de/6195/
|
68 B
463 B
|
42ms
42ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 5587
|
0
0
|
231ms
231ms
|
Document
text/html |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753473&bpp=5&bdt=458&fdt=189&idt=189&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=56&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4627&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=9&uci=a!9&fsb=1&xpc=sLHmEK6lDW&p=https%3A//www.golem.de&dtd=192
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b302346b0322fd916af0223f63c2321d&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db302346b0322fd916af0223f63c2321d%2...
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b302346b0322fd916af0223f63c2321d&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db302346b0322fd916af0223f63c2321d%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b302346b0322fd916af0223f63c2321d&userId=adscale-user:3fa1459893034302b51d3bccf06c74de
|
44 B
528 B
|
34ms
34ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
setuid
ib.adnxs.com/
Redirect Chain
-
https://tracking.m6r.eu/sync/appnexusRedirect
-
https://ib.adnxs.com/setuid?entity=197&code=b302346b0322fd916af0223f63c2321d
|
43 B
1006 B
|
12ms
12ms
|
Image
image/gif |
185.33.223.209
AppNexus
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swI0awMi_ZFq8CI_Y8IyHQ
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swI0awMi_ZFq8CI_Y8IyHQ&google_tc=
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
523 B
|
30ms
30ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
204
No Content
|
m
ad.yieldlab.net/
Redirect Chain
-
https://tracking.m6r.eu/sync/yieldlabRedirect
-
https://ad.yieldlab.net/m?dt_id=36356&ext_id=b302346b0322fd916af0223f63c2321d
|
0
495 B
|
28ms
13ms
|
Image
text/plain |
2.16.122.151
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
frame
delivery.selfcampaign.com/tag/146005/
Frame 50EC
|
0
0
|
28ms
13ms
|
Document
text/html |
148.251.131.173
HETZNER-AS
|
|
General
- Full URL
- https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
- Requested by
- Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
148.251.131.173
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.173.131.251.148.clients.your-server.de
- Software
-
nginx/1.14.0 (Ubuntu) /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/506/3014/s/
|
36 KB
13 KB
|
50ms
18ms
|
Script
application/javascript |
89.163.159.110
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
track2.selfcampaign.com/tag/
|
43 B
501 B
|
29ms
7ms
|
Image
image/gif |
148.251.69.233
HETZNER-AS
|
|
General
- Full URL
- https://track2.selfcampaign.com/tag/?request_id=168b7597-7785-46f1-a313-ef468108a42b&_auid=70ab88ed6feb870cd25576f74e32ae4b&tag=146005&tags_usergroup=2805&project_id=611&account_id=545&ipzones=&pxs=&_autags=T0T&marked_tags=&lang=en-US&screen=1600x1200&screen_a=1200x1600&color_d=24&location=https%3A//www.golem.de/&referrer=&location_utm_medium=&location_utm_source=&location_utm_campaign=&location_utm_term=&location_utm_content=&title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.69.233
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.233.69.251.148.clients.your-server.de
- Software
-
nginx/1.9.7 /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
/
track2.selfcampaign.com/map_td/
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=70ab88ed6feb870cd25576f74e32ae4b
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=70ab88ed6feb870cd25576f74e32ae4b
-
https://track.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95
-
https://track2.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95
|
43 B
501 B
|
4ms
2ms
|
Image
image/gif |
148.251.69.233
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
track2.selfcampaign.com/map_td/
Redirect Chain
-
https://c1.adform.net/serving/cookie/match?party=1173
-
https://c1.adform.net/serving/cookie/match?CC=1&party=1173
-
https://track2.selfcampaign.com/map_td/?tdid=1218937380103331980&source=adform
|
43 B
501 B
|
6ms
1ms
|
Image
image/gif |
148.251.69.233
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
mark
lib.selfcampaign.com/tag/146005/
|
0
0
|
20ms
20ms
|
Image
text/plain |
148.251.131.173
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
675ms
403ms
|
XHR
application/json |
52.216.240.6
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
rmp-hcjson.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
291 B
663 B
|
56ms
14ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
rmp.min.js
Show response
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
|
378 KB
110 KB
|
18ms
18ms
|
XHR
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:80b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=UA-518800-2
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
58ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
57ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
57ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
58ms
16ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 6A1F
|
0
0
|
227ms
227ms
|
Document
text/html |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753478&bpp=4&bdt=462&fdt=241&idt=241&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5336&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=10&uci=a!a&fsb=1&xpc=YouWYOCnvU&p=https%3A//www.golem.de&dtd=244
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
Cookie set
/
d.agkn.com/iframe/8613/
Frame DAFB
|
0
0
|
37ms
7ms
|
Document
text/html |
18.185.187.173
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=252205592&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
18.185.187.173
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-18-185-187-173.eu-central-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
sp_EME4-915232_rc.jpg
www.golem.de/8599/ad-time/
|
68 B
463 B
|
43ms
42ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_EME4-273836_rc.jpg
www.golem.de/7515/ad-time/
|
68 B
463 B
|
43ms
43ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
311 B
999 B
|
607ms
560ms
|
XHR
application/json |
13.224.196.120
Amazon.com
|
|
|
GET
H2
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=553138793&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=2062521108.1571290753&jid=733688719&_gid=1182937729.1571290754&gjid=320221929&_v=j79&z=884029694
|
35 B
102 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:400c:c00::9a
Google LLC
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=2062521108.1571290753&jid=733688719&_gid=1182937729.1571290754&gjid=320221929&_v=j79&z=884029694
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c00::9a
Brussels, Belgium,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
122 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:80b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=553138793&t=timing&_s=2&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&utc=JS%20Dependencies&utv=load&utt=1059&_u=IAhAAUAB~&jid=&gjid=&cid=2062521108.1571290753&tid=UA-518800-2&_gid=1182937729.1571290754>m=2ouaa0&z=1132604976
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 9C0F
|
0
0
|
18ms
18ms
|
Document
text/html |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1571290753&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1571290753539&bpp=4&bdt=523&fdt=228&idt=228&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120&nras=1&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=11&uci=a!b&fsb=1&dtd=234
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
vgs.json
Show response
cdn.radiantmediatechs.com/rmp/rr/
|
5 KB
3 KB
|
47ms
17ms
|
XHR
application/json |
2606:4700:20::681a:3cd
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
|
57 KB
12 KB
|
16ms
15ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 1597
|
0
147 B
|
20ms
20ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstLMAldr1cwb4Mc_THmqyvbpJ0kugdk9OjQwMo_GrtWFwcQxNKNBWNQHULjkiVLu04EZpzhoBw4LU2fQDKKYBiJE7BYJwlL4xN1Pb-rK7jcD3KQxQahOnlUXZDL1QXgwm8BzOHJHJMIgIMZ7UT9GuQsuWLtFnOFz93SkgiIP9x43pGX6C5OQeHO3syHpfF8GHSVYmt-UUDzNgHYtAMBgBoZTTqDWPCis_t1j39dP_tdF-dPBYRrh9U3EU4f4DW1inJUboWplnfGT7X4fjJPwYs1OM5uoaSGcVwPjuv_a92vSOtUT9Rc&sai=AMfl-YT3zFQNo9hLev0-TmqdjZr-urPrgfWK7Zp2NMQPw_g1SlsAeOH62mRR0KnJzZ-EaRTWDmtXBmMDr5TgJtkiZCZwQ_EwhHM0j3cjMgpHRQ&sig=Cg0ArKJSzI3WGrGIgCeREAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
Cookie set
adServer.bs
bs.serving-sys.com/BurstingPipe/
Frame 2967
|
0
0
|
55ms
16ms
|
Document
text/html |
80.252.91.53
TELECITY-LON
|
|
General
- Full URL
- https://bs.serving-sys.com/BurstingPipe/adServer.bs?cn=rsb&c=28&pli=29025839&PluID=0&w=300&h=600&ord=1565171349&ifrm=2&ucm=true&ncu=$$https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjstxnwPmuiyRx9kX4kyZU_627s1AU9wcDNKnDhGGbL7Ll-Ak8hzk90cyBv97iQVCWznF1XwQloID7-Suu0OQ2L2VZPsgkpjUS0J7OCH9WJst1MVu064vT189XX3w0Y4D5P4KkkjBPVM0kN_yORowWQDZ1mybSepB9oZcv2BHDJfBdUm8jtDyZELDHvUrmbMoUoSTwzd_XFncatpYf9AiLeLNRdvuXqpNi8prFOmMwnTZ1AnJS5cUALXABXfquqHZN52co0k5-IFbH6UacYXIH-Dmqw%2526sai%253DAMfl-YRwED3uY9IPj2NdyR2V0ejGf0-aqSCkxmnhVj-R3-5w98v0uELxa6H3RPqL0UKKSB99zUAG_9UICiy4QiacSDfL0qIKw56T-3EAjk4GJA%2526sig%253DCg0ArKJSzCIE94r__iRcEAE%2526urlfix%253D1%2526adurl%253D$$
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_256_CBC
- Server
-
80.252.91.53
, Netherlands,
ASN15830
(TELECITY-LON, GB),
- Reverse DNS
- Software
-
Microsoft-IIS/7.5 /
ASP.NET
ARR/2.5
ASP.NET
- Resource Hash
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 1597
|
77 KB
29 KB
|
16ms
15ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 9F47
|
0
57 B
|
21ms
20ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssdmlWJkaV6TgdeFWYxdHcSw-AhEAc4dCPQqdVbCMLJZk_f7RETuwe5vjbyuIG2n5hRr1jIzhbiee0k8F83EUwSqm2ass_LjbzOz9ynWPEp8Zs5W_41Ii756JtqgQC5zv10sP2Tkzo3PmFzebZ8EZ7oYPM45l99EgHwyD_Dxt9uQBZ0iGkSKXupfPQD4zrTcA-iTizfhwe57KU9A8pLd7F7ZGUKkZvRW0GAvF6J6UtH-e2dJHLaMwWUzAf9oPvyl7A_PgU-lTtyul4Tjc-mLzd0P77tg25KcoAkI4FzTlJAtPW4CXg&sai=AMfl-YQP4IX0svkybza3r6xW0IOOWGQFkfCaKR8ozyu2gC-gdmBGHojYuzRoWZtWyuF78xVWScNYHo-f_bTAiF7pAr2USYdNJ_a6-r_lBYBKfQ&sig=Cg0ArKJSzAK5ENQqOfj7EAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sDm_BB_Pos.js
Show response
cdn.stroeerdigitalmedia.de/Ads/script/
Frame 9F47
|
41 KB
8 KB
|
20ms
10ms
|
Script
application/x-javascript |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 9F47
|
77 KB
29 KB
|
16ms
16ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 14EA
|
0
129 B
|
25ms
19ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstINl2qs7FDWnffJZxFPSSgqcPDjYJBW5d3-XrpOLmhdRoknBJJsBdfjWJlndpbJ0T0rRswXO7LMw0TlA118E1LM58C0CnuKpmQgbgOdWbY413luQnxyxvZtZME8WqHb9eYA61jgXXGGL_hLylgDr49SFOQJpcyDcJ1VFxUWBXZnjf9Em5WDwIhnxEbXbq1ls_UEsNld7XyHBPp-d5cN6MIIs2_8ZVwaQu7P97AFQXevDjQXlRmtbIiumjl7ikFyHotrA_jOrmdVmz7Oymad_6ArRM4rw&sai=AMfl-YSCLSIlsxsL8Zwie4Uix8Nt8QWJqiCyTfUp2Nk1Rqc0neEE8H1wO4ew68NH0U_Ew_aGXEGs3uxtqPhBTTr9Onk4CyklojtPQGE599_gOQ&sig=Cg0ArKJSzCMugSHor2xLEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 14EA
|
77 KB
29 KB
|
19ms
14ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
imgad
tpc.googlesyndication.com/pagead/
Frame 14EA
|
24 KB
25 KB
|
9ms
4ms
|
Image
image/jpeg |
2a00:1450:4001:81e::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDnm4Oh2QEQARgBMgitfI9gey4F2g
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
16ms
16ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame FAB8
|
0
57 B
|
19ms
18ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstn9bwm7xD0dAKKvg7q-TcgJqL2Oltqq-ETRyfyTj6tzzW3j89hUNPuqbFKmqvVzTRdaVWTEGjBelMhL1E4oMDliGICTNt_w-1iaWyLt2vKezJ41ZySVj2s8t6sKwLn5vfMuQgxVk4Hi-0fMOz9hAGEDAOiS5RdT8f3LfAKNYkDrWqjVhDVw-p15nuoaeBN6rZF1UVlx7oXxiwPyk2Yd22kFyBQhh2XFaGRFNbqesuvuwfyPNUfTmfW76n54CeCvt3nkznXKwhJ0A8VV9JGAD_j5B1K&sai=AMfl-YQ3fw8DHZraHeJ4RbxvrICGw1eGtSQr-uXfsQZTLwgmviS9XSkykkzI2cPy95ySacE-LiZI0_CcJULzxPQuOBbXD1pBcEXFEuFXeKBdtQ&sig=Cg0ArKJSzGuxkTDowF8aEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
Frame FAB8
|
45 KB
14 KB
|
18ms
17ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame FAB8
|
77 KB
29 KB
|
17ms
16ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 3651
|
0
57 B
|
21ms
20ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssYlKNWaDFlbL_557kKxe93FXc9jaL0d0d-lpyka3VXy7NeUkH9CF9szvzjGQRt5sd4NVDzDfBeyPNZfwrlNXFW2AM8nXcMVFDjx-UhYDuz3WG-3Z1U5plYaFcHJUCj0_o-yzZlyPvXqdlSxAfYijTH2k5LC_OJWLkH-WZxOkfTGshZ6tV6JX102Rmi8v3-yOKMSvVl_aOwjdltpC6N-wFQVe-0rapfvKS4b2YFNS7Y3wHAbm8bLyUHAASSbUtuErkbaHN7erpNtvEd8sWPIdsEsUYC&sai=AMfl-YRDCFABP845CfTr8aQftgmbY4eofuAdhZQ5oOOzuLK7IWy04sJNbstTSQx_IL3u2t4ylp1VP9zkgDJrkVVWmGKXWU85hzgJFkPu-eJzpg&sig=Cg0ArKJSzGhxWj7w2YpCEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
Frame 3651
|
45 KB
14 KB
|
41ms
40ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 3651
|
77 KB
29 KB
|
17ms
15ms
|
Script
text/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
|
271 KB
92 KB
|
41ms
17ms
|
Script
text/javascript |
2a00:1450:4001:81b::200a
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
68 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
715 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
8 KB
9 KB
|
16ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
15 KB
15 KB
|
15ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 1597
|
212 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
1ms
1ms
|
XHR
text/javascript |
188.40.118.169
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
fw.adsafeprotected.com/rjss/servedby.flashtalking.com/306581/37675975/imp/2/111066;3935697;201;js;BusinessAdvertising;VansDirectDisplayCPMRunofChannelBillboardBusinessAdBillboard800x250B2BSitelist0...
Frame 9F47
|
197 KB
67 KB
|
82ms
40ms
|
Script
application/javascript |
199.166.0.24
Integral Ad Science
|
|
General
- Full URL
- https://fw.adsafeprotected.com/rjss/servedby.flashtalking.com/306581/37675975/imp/2/111066;3935697;201;js;BusinessAdvertising;VansDirectDisplayCPMRunofChannelBillboardBusinessAdBillboard800x250B2BSitelist0108201931102019AdgapId01980018340071953001/?ftx=&fty=&ftadz=&ftscw=&ft_custom=&ftOBA=1&ft_agentEnv=0&ft_referrer=https%3A%2F%2Fwww.golem.de%2F&cachebuster=907575.2704937905
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
199.166.0.24
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- anycast.fw.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- d5d23663e6acf63a8f87ae01969de4602e62c580d104df396ce906a4a591645d
|
GET
DATA
|
200
OK
|
truncated
/
Frame 14EA
|
217 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
pubads_impl_2019100301.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame FAB8
|
157 KB
58 KB
|
30ms
29ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame FAB8
|
113 B
178 B
|
30ms
30ms
|
Script
application/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
index.shtml
Show response
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
118 KB
24 KB
|
18ms
16ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
43ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/data?/BXZRDiNAAKktFLkqFFlqwF23A52AwwALl1FDLkqFKlkyB23A52AwwA2qoFx1A3xAy5Aw3A1yA01AzzA1zFxwExrFnuFkBF/k0FhEmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5BELlnFBUkzFnBPwDAAZAwSAcAAAAP0IAAAAAAABN4GAPBAAFAAN4GTYeNAPAAAhPAEQABYeNAZBAAOA55A55A85B55A58E55A55AFAy4Ax3AzBErYeNASksF8FjAAAAAAAAAAAAEAAAN4GAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4ExyA1BEMAxzA4yA5wA0xAz5Az4AGAkpFylFj0FAAAAJAx0A15A12A33A1BEKA1xA5zA5wA12A44AJAylFj0FhuFnsFlBFKA1xA5zA5wA12A44AKA1xA5zA5wA12A44A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFdhPAEQAsEA9BAFAAAYeNAAAAARA4tB1uFruFv3FutBzwAw4ExyA1BEAAAAAAAAAAAAAAAAQtjFCOhyUA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
pubads_impl_2019100301.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 3651
|
157 KB
58 KB
|
17ms
17ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 3651
|
113 B
175 B
|
17ms
17ms
|
Script
application/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bridge3.342.1_de.html
imasdk.googleapis.com/js/core/
Frame B5C3
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81b::200a
Google LLC
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.342.1_de.html
- Requested by
- Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
client.js
Show response
s0.2mdn.net/instream/video/
|
26 KB
11 KB
|
29ms
16ms
|
Script
text/javascript |
2a00:1450:4001:81e::2006
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame 9F47
Redirect Chain
-
https://fw.adsafeprotected.com/rfw/servedby.flashtalking.com/306581/37675975/imp/2/111066;3935697;201;js;BusinessAdvertising;VansDirectDisplayCPMRunofChannelBillboardBusinessAdBillboard800x250B2BSi...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
17ms
12ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
sca.17.4.95.js
Show response
static.adsafeprotected.com/
Frame C4DD
|
81 KB
20 KB
|
59ms
24ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame FAB8
|
302 B
219 B
|
104ms
103ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2737931407413196&correlator=3982647042648050&output=ldjh&impl=fif&eid=21064578%2C21062415%2C21063204%2C21064521%2C21064580&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191017&iu=%2F53015287%2Fgolem.de_d_970x250_4_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32&scp=adslot%3Dbillboard2%26src%3Dsdg%26yieldlove_pid%3D18494%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522billboard2%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522f10x1%2522%255D%252C%2522as%2522%253A%255B%2522billboard2%2522%255D%252C%2522hb_unit%2522%253A%255B%2522billboard2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%2522b302346b0322fd916af0223f63c2321d%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-1%2522%252C%2522n19-2%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-2%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-5%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-0%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-2%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-0%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n23-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-0%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-1%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252218494%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A18494.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D927fd4c50ee77c67%3AT%3D1571290753%3AS%3DALNI_MaYfvPv2lJk348d94C9Imr1Yej2Gg&cdm=www.golem.de&bc=31&abxe=1&lmt=1571290754&dt=1571290754289&dlt=1571290753886&idt=389&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=251&oid=3&adx=308&ady=1564&adk=2408324468&uci=mje1h89pyj45&ifi=1&ifk=3801567061&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=970x10&msz=970x10&ga_vid=2062521108.1571290753&ga_sid=1571290754&ga_hid=1011560555&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ba03830de11ce7061799f1aae4f67e05d7ca0e8012b0cb91075cde9c180aeee7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019100301.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame FAB8
|
63 KB
24 KB
|
17ms
17ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame FAB8
|
0
0
|
5ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 3651
|
306 B
212 B
|
86ms
85ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2337805765980549&correlator=4266859913123109&output=ldjh&impl=fif&eid=21064687&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191017&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C301x250%7C300x126%7C34x32&scp=adslot%3Drectangle2%26src%3Dsdg%26yieldlove_pid%3D17300%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle2%2522%255D%252C%2522af%2522%253A%255B%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle2%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%2522b302346b0322fd916af0223f63c2321d%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-1%2522%252C%2522n19-2%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-2%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-5%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-0%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-2%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-0%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n23-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-0%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-1%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217300%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17300.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D927fd4c50ee77c67%3AT%3D1571290753%3AS%3DALNI_MaYfvPv2lJk348d94C9Imr1Yej2Gg&cdm=www.golem.de&bc=31&abxe=1&lmt=1571290754&dt=1571290754340&dlt=1571290753951&idt=382&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=2&adx=993&ady=4551&adk=4008869679&uci=46blrpot7irv&ifi=1&ifk=4200391111&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=301x10&msz=301x10&ga_vid=2062521108.1571290753&ga_sid=1571290754&ga_hid=1752214803&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 1eb5b55f5d17d060da022e8abf0bfc5773266a253e28e871517b5be4aeabe550
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019100301.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 3651
|
63 KB
24 KB
|
18ms
18ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 3651
|
0
0
|
5ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
263ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=306581&asId=5ff2a8b9-e983-0400-e1af-e122889aea10&tv={c:rhspej,pingTime:-2,time:130,type:a,im:{sf:0,pom:1,prf:{beA:364,beZ:365,mfA:367,cmA:367,inA:368,inZ:371,prA:371,prZ:406,si:410,poA:411,poZ:417,cmZ:417,mfZ:417,loA:458,loZ:459,ltA:494,ltZ:494}},sca:{dfp:{df:0}},env:{gca:0},clog:[{piv:-1,vs:n,r:,w:0,h:0,t:45}],es:0,sc:1,ha:1,gm:0,slTimes:{i:0,o:0,n:130,pp:0,pm:0},slEvents:[{sl:n,t:45,wc:0.0.1600.1200,bkn:{piv:[126~1],as:[126~na.na]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rF8jSdz+1111|1112|12|1311|1312|1411|1412|15|161|17|18|19|1a11|1b*.306581-37675975|1c|1d|1e|1f|1g,idMap:1b*,rend:0,renddet:na,rmeas:0,slid:[google_ads_iframe_4444/disp_ctc_golem.de_sd/startseite_1,google_ads_iframe_4444/disp_ctc_golem.de_sd/startseite_1__container__,sdgAdServerContainer-banner,iqadtile3,screen,grandwrapper],sinceFw:83,readyFired:true}&br=u
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
DATA
|
200
OK
|
truncated
/
Frame FAB8
|
214 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
Enabler.js
Show response
s0.2mdn.net/ads/studio/
Frame 3999
|
123 KB
41 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:81e::2006
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 3651
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
|
208 KB
60 KB
|
9ms
9ms
|
XHR
application/javascript |
13.224.196.120
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
2ms
2ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/data?/BXZRE0QAA/k0FwImvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wALlnFCUkzF2BP7AAAAAAAABRq1APBAAFAARq1Tl5/APAAAXUAKAABl5/AZAAAOA55A55A85B55A58E55A55AGAyxA53A5zArl5/APQCAhPAEQAHYeNAPAAAXUAKAAHl5/ASksFeFjAAAAAAAAAAAAEAAARq1AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAx2Aw4E2wAwBEMAxzA4yA44A30A04A4xAGAkpFylFj0FAAAAKA03Az5Ax3AzzA3xAKA1xA4yAz2A2wA2yADAzrF5BFKA1xA4yAz2A2wA2yAKA1xA4yAz2A2wA2yAxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAAl5/AAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFLAJlWA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/data?/BXZRF1QAA/k0FSNmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA4wALlnFDTkzFPPBBAAAAAAABtk6ASksFCFjAAAAAAAAAAAAEAAAtk6AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AxBEMAxzA4yA2zA21A11A1yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA05A4wA05AwyA40AKAipFssFivFhyFkyBKA05A4wA05AwyA40AKA05A4wA05AwyA40A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBQtjFSzt+YA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
DATA
|
200
OK
|
truncated
/
Frame 9F47
|
217 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/data?/BXZRH8QAA/k0FkRmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA4wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA43AywA41A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzAz0A13Ax5AxmAjpFk9BxzA4yA33Ax1Ay2AxyAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B1xAzzA01A3xA5xAmhEwkF91AxzAz0A13Ax5AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA44ATkzFARksFAQtjFJRZuZA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/data?/BXZRITRAALlnFEUkzFYBPHAAAAAAAAB9yjAPAAAFAA9yjTTfPAPAAAJGAMCABTfPAZBAAOA55A55A85B55A58E55A55AGAx0A22AyxArTfPASksFhFjAAAAAAAAAAAAEAAA9yjAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AwBEMAxzA4yA33Ax1Ay2AxyAGAkpFylFj0FAAAAIAy4A3yAw4A11AKA1xAzzA01A3xA5xAGAihFuuFlyFKA1xAzzA01A3xA5xAKA1xAzzA01A3xA5xA0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFdJGAMCACMA6DAFAAATfPAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFH6AvSA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/data?/BXZRJTRAA/k0FMWmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA4wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA43AywA41A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzAz0A13Ax5AxmAjpFk9BxzA4yA33Ax1Ay2AxyAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B1xAzzA01A3xA5xAmhEwkF91AxzAz0A13Ax5AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA44AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF90A44A54AwxAy0A3mAhwFk9B04A45A4wAxyA03AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A00AxxATkzFARksFAQtjF6xZGeA
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
208 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
85ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=306581&asId=5ff2a8b9-e983-0400-e1af-e122889aea10&tv={c:rhspj7,pingTime:-10,time:428,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtMTIwfHxNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNF81KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzQuMC4zNzI5LjE2OSBTYWZhcmkvNTM3LjM2fHwxfHwxfHxHb29nbGUgSW5jLnx8bg--,asp:1571290754644||6d572370d520955e6270e793b77cd361||675c74d5f114ba25a49fb0f4cb02f70f||5da6f724cb33ae1e61ae7049ae656782||2bf78edfc36a84429fd64dbb26bf4cfe||c462ecef40ce09d50a324072f030aeab||30cfa760bc2701b3be0c08a26f5879b0||2f3d9766291df43a3546a4be6b42fe3d||1529428597}
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
19ms
6ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
11ms
10ms
|
Script
application/javascript |
89.163.159.110
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
101ms
27ms
|
Script
application/javascript |
62.168.44.118
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
88ms
28ms
|
Script
text/javascript |
52.51.174.200
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
496 B
|
33ms
19ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame 1FBE
|
0
0
|
67ms
67ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
33ms
10ms
|
Script
text/plain |
85.114.144.106
MYLOC-AS
|
|
General
- Full URL
- https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
- Requested by
- Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
85.114.144.106
, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
2 KB
|
28ms
10ms
|
Script
application/javascript |
2600:9000:2156:600:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
30ms
30ms
|
Script
text/javascript |
52.51.174.200
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=b302346b0322fd916af0223f63c2321d&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=241221172442
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.51.174.200
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-51-174-200.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- dd8680fd5dae60786359a6b7cd623a54c0fd5b133211411ad83ef0342425cb61
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
117ms
29ms
|
Script
application/javascript |
54.154.35.6
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame DFBE
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBS7ZBiR0WiRZWSUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4206909570601015878
|
42 B
662 B
|
29ms
28ms
|
Image
image/gif |
52.51.174.200
Amazon.com
|
|
|
GET
H2
|
200
|
launcher.js
Show response
sak.userreport.com/sdm/
|
60 KB
19 KB
|
36ms
7ms
|
Script
application/javascript |
13.224.196.116
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
94ms
94ms
|
XHR
application/json |
52.216.240.6
Amazon.com
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=6277786461
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.216.240.6
Ashburn, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- s3-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H/1.1
|
200
OK
|
rmp-hcjson.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
291 B
663 B
|
14ms
14ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php?cache=9458096450
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a00:13c8:f5::f:4b3d:175
, Germany,
ASN25291
(SYSELEVEN SysEleven GmbH, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
311 B
992 B
|
6ms
6ms
|
XHR
application/json |
13.224.196.120
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=2782838022
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.196.120
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-224-196-120.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/9cb2d71f7f84b4ffdef77b1fb6fa294ecdc8d2e1/
|
311 B
1 KB
|
82ms
56ms
|
XHR
application/json |
136.243.91.175
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/9cb2d71f7f84b4ffdef77b1fb6fa294ecdc8d2e1/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.91.175
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.175.91.243.136.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 93AA
|
0
0
|
121ms
29ms
|
Document
text/html |
108.128.71.27
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.golem.de/
|
24 B
356 B
|
34ms
0ms
|
Script
application/octet-stream |
148.251.2.60
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.2.60
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.60.2.251.148.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 3358
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/db67dad8109fb835786c8d8915d37cf25d55772d/
|
110 B
670 B
|
18ms
4ms
|
XHR
application/json |
136.243.91.175
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/db67dad8109fb835786c8d8915d37cf25d55772d/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.91.175
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.175.91.243.136.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 1597
|
42 B
110 B
|
17ms
16ms
|
Image
image/gif |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstRYzFEOenLtflP38Xa-hxdGXxnww16PS-WG-dXAb2iNMfml19P2oiCZ4zi_7bYRWyoVGqgBulybNL8JenZRgzcLYfnkJa3abOhGwOgKDk&sig=Cg0ArKJSzA8wtEtL7dz_EAE&adk=3761801772&tt=493&bs=1585%2C1185&mtos=0,1024,1024,1024,1024&tos=0,1024,0,0,0&p=10,1303,610,1603&mcvt=1024&rs=3&ht=0&tfs=492&tls=1516&mc=0.94<e=0.94&bas=0&bac=0&met=no&avms=nio&niot_obs=163&niot_cbk=271&md=2&lm=2&rst=1571290753849&rpt=265&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1603%2C12614&ss=1600%2C1200&pt=1025&bin=1&deb=1-2-9-22-14-14-142-12-0-0-0&tvt=1509&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 14EA
|
42 B
110 B
|
16ms
16ms
|
Image
image/gif |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsv-KoBz9y20K41dZq5P5nBeR7lDxSkewX0KNSg8uWJ3ioNtzqBeD3NhD7xbbeRwD4KTrPlisQ5kRQdCJ_nzWHDYB5isgupegX0hykUNX1M&sig=Cg0ArKJSzN5WgiikHGSDEAE&adk=2740773112&tt=493&bs=1585%2C1185&mtos=1024,1024,1024,1024,1024&tos=1024,0,0,0,0&p=1028,993,1153,1293&mcvt=1024&rs=3&ht=0&tfs=492&tls=1516&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=179&niot_cbk=271&md=2&lm=2&rst=1571290753866&rpt=246&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1603%2C12614&ss=1600%2C1200&pt=1025&bin=1&deb=1-2-9-22-14-14-142-12-0-0-0&tvt=1509&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
662 B
|
28ms
28ms
|
Image
image/gif |
52.51.174.200
Amazon.com
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/b88991cba97dc53c990739b5dba0b4d0f631ad3f/
|
111 B
671 B
|
7ms
6ms
|
XHR
application/json |
136.243.91.175
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/b88991cba97dc53c990739b5dba0b4d0f631ad3f/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.91.175
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.175.91.243.136.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 9F47
|
42 B
110 B
|
17ms
17ms
|
Image
image/gif |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsvNulzrd6Gj4j01xExSbxFcNmHS1zbWft2yMCLO81bsqLPJJgV_E-NkWI6cwkUWdcB3eruf_UmscJmqGubRf0iWDnS6k_5PdA-z-koTZW8&sig=Cg0ArKJSzLCgpn150elCEAE&adk=2546325955&tt=809&bs=1585%2C1185&mtos=1039,1039,1039,1039,1039&tos=1039,0,0,0,0&p=140,393,390,1193&mcvt=1039&rs=3&ht=0&tfs=788&tls=1827&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=171&niot_cbk=270&md=2&lm=2&rst=1571290753858&rpt=532&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1603%2C12614&ss=1600%2C1200&pt=1025&bin=1&deb=1-2-9-32-17-14-169-15-0-0-0&tvt=1825&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
60 B
|
17ms
17ms
|
Image
image/gif |
2a00:1450:4001:824::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=ama_stats&wpc=ca-pub-2342548244565729&su=www.golem.de&pg_h=12614&pg_w=1603&c=7&aa_c=0&av_h=207.857&av_w=505.714&av_a=90442.857&s=10&all_s=10&b=6024.500&all_b=6024.500&d=0.115&all_d=0.115&ard=0.031&all_ard=0.031&dt=d
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
copy_das_geht_weiss.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
3 KB
2 KB
|
15ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
copy_das_geht.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
3 KB
2 KB
|
16ms
14ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
copy_5_min.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
9 KB
3 KB
|
17ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
copy_complete.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
3 KB
1 KB
|
16ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
copy_loading.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
3 KB
2 KB
|
16ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
kacheln_6.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
488 B
850 B
|
16ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
kacheln_5.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
669 B
1 KB
|
21ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
kacheln_4.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
670 B
1 KB
|
22ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
kacheln_3.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
672 B
1 KB
|
18ms
14ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
kacheln_2.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
616 B
978 B
|
22ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
kacheln_1.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
535 B
897 B
|
21ms
14ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
kacheln_0.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
503 B
865 B
|
21ms
14ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
button.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
7 KB
3 KB
|
37ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
logo.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
5 KB
2 KB
|
32ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
copy_service.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
4 KB
2 KB
|
37ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
image_metakube.png
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
18 KB
18 KB
|
37ms
14ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
copy_metakube.svg
www.golem.de/microsite/syseleven19/metakube/
Frame 3999
|
4 KB
2 KB
|
37ms
15ms
|
Image
image/svg+xml |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
index.html
cdn.districtm.io/ids/
Frame 6A60
|
0
0
|
145ms
144ms
|
Document
text/html |
104.16.190.66
Cloudflare
|
|
General
- Full URL
- https://cdn.districtm.io/ids/index.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.190.66
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame F719
|
0
0
|
20ms
7ms
|
Document
text/html |
2.18.232.130
Akamai Technologies
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.130
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-130.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
Cookie set
showad.js
ads.pubmatic.com/AdServer/js/
Frame 6CE7
|
0
0
|
18ms
6ms
|
Document
text/html |
2.18.233.180
Akamai Technologies
|
|
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 2BDD
|
0
0
|
17ms
16ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.163.0 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
data
lb82.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.33.79
HETZNER-AS
|
|
General
- Full URL
- https://lb82.s400.meetrics.net/data?/BXZRKKOBALlnFFUkzFUCPXAAAAAAAABjWnAPAAAFAAjWnTCDTAPAAAhPAFHBBCDTAZAAAOA55A55A85B55A58E55A55AGAx2AxxA43ArCDTAPMDAJGAMCAHTfPAPAAAgMA6DAMTfPAPAAAhPAFHBICDTAPAAA0EAcYAIbosASksFFGjAAAAAAAAAAAAEAAAjWnAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdhPAFHBtEA6DAFAAACDTAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFj4p9SA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.79
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h380.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
2ms
0ms
|
XHR
text/javascript |
188.40.118.169
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1571290763643
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|